绕过web应用防火墙
以下内容是对该pdf的翻译:
《OWASP_Stammtisch_Frankfurt_-Web_Application_Firewall_Bypassing-_how_to_defeat_the_blue_team》
作者:Khalil Bijjou
译者:whale
前景提要
配置了waf的网站数量在增加
waf让渗透测试变得更加困难
在渗透测试中,绕过waf是一个重要的部分
对web应用防火墙的介绍
- 在安全层面保护web应用
- 配置在用户和web服务器交互的中间
- 比传统防火墙更理解HTTP交互
- 检查恶意交互然后阻止它
waf的功能:
- 预处理阶段:决定是否对一个请求进行继续处理
- 标准化阶段:理解用户输入
- 验证阶段:根据策略检查用户的输入
输入验证:
安全模式定义了如何执行检查
检查由正则表达式组成
三种安全模式:1. 主动安全策略 2. 被动安全策略 3. 混合安全策略
主动安全策略(基于白名单) | 被动安全策略(基于黑名单) |
---|---|
除非已知安全的,其他的都拒绝 | 拒绝黑名单上的,其他都允许 |
预防0day漏洞 | waf随带的特性 |
比黑名单更加安全 | 配置速度快 |
需要对应用比较了解 | 不需要太多知识 |
创建策略是一个比较花时间的过程 | 保护许多类型的应用程序 |
倾向于误报 | |
比较消耗资源 |
绕过的方式和技巧
- 预处理阶段:使得waf跳过输入验证
- 标准化阶段:使得waf解释input与服务端后端不同
- 验证阶段:使用waf检测不到的载荷
预处理阶段的利用
绕过参数验证
PHP从参数名称中删除空格或将它们转换为下划线
http://www.website.com/products.php?%20productid=select 1,2,3
asp移除了“%”字符后面的十六进制数字
http://www.website.com/products.aspx?%productid=select 1,2,3
一个waf不会拒绝未知的参数,那么用这种技术就可以绕过。
预处理阶段的利用案例
X-* Headers
- waf可能被配置为相信特定内网ip
- 输入验证可能不会应用在源于这些ip的请求
- 如果waf从请求头中获取这些ip,而请求头可能被用户改变,那么绕过就可能发生。
- 用户可以控制以下的http头:
1
2
3
4X-Originating-IP
X-Forwarded-For
X-Remote-IP
X-Remote-Addr异常http方式
未正确配置的web服务器可能接受异常HTTP方式
一个waf如果只检查get和post请求,就可能绕过
使得waf超负荷
如果载入太慢了,一个waf可能被设置为跳过输入验证
对waf经常性的请求
大量恶意请求,可能会导致waf过载,然后跳过一些请求
http参数污染
- 使用同样的名称发送一系列参数
- 解释这个请求的技术:
http://www.website.com/products/?productid=1&productid=2
1 |
|
误匹配案例
以下的请求
?productid=select 1,2,3 from table
可以被分为?productid=select1&productid=2,3 from table
- waf看到两个不同的参数,就可能不会检查payload
- asp.net背后会将参数合并
http参数碎片
- 将代码分割到不同的参数
- 查询案例:
sql= “SELECT * FROM table WHERE uid= “+$_GET[‘uid’]+” and pid= +$_GET[‘pid’]“ - 以下的请求:将会导致以下sql查询
1
http://www.website.com/index.php?uid=1+union/*&pid=*/select 1,2,3
1
sql= "SELECT * FROM table WHERE uid= 1union/* and pid= */select 1,2,3"
双url编码
- waf将url编码字符解析为ascii编码
- waf可能被配置为仅仅解码一次
- 双url编码是可能导致绕过的payload
’s’ -> %73 -> %25%37%33
- 以下的payload包含了一个双url编码字符
1 union%25%37%33elect 1,2,3
绕过基于规则检测
两种方式:
使用payloads来暴力枚举
对wafs规则进行逆向工程
渗透测试者的方式
- 和渗透测试类似
- 取决于六个阶段,然而阶段0可能不总是必须的
阶段0:禁用waf来确认漏洞
- 更容易在应用程序中寻找安全漏洞(对应用的安全水平的审查更加精确)
- 当waf开启时候,让测试更加有针对性
- 在一些渗透测试中可能不被认可
阶段1:对目标进行信息搜集
- 是后续阶段的基础
- 信息搜集:
1
2
3
4web服务器
编程语言
waf&安全模式
内网ip地址
阶段2:攻击预处理阶段
目标:使得waf省略输入验证
- 确认http请求的那一部分会被waf检查,进而构造payload
1 |
|
阶段3:尝试一个误匹配
目标:使得waf和服务器解释请求不一样,从而不会检测到它
- 需要知道服务段的技术
阶段4:绕过字符集
目标:发现一个payload,不会被waf规则集阻止
- 暴力枚举,发送不同的payload
- 对规则集进行逆向工程阶段5:确认各式漏洞
1
2
3发送对构造payload有用的字符和关键词
发现哪些会被阻塞
尝试构造一个exp基于以前步骤的结果
目标:发现其他不会被waf检测的漏洞 - 失效的验证机制
- 提权漏洞
阶段6:漏洞披露
目标:通知用户这些漏洞
- 建议客户修复root权限导致的漏洞
- 时间不充足时,漏洞/弱点应该被waf规则所保护
- 解释waf可以帮助减轻漏洞危害,但不能修复它
WAFNinja
- 用python写的命令行工具
- 自动化的解决方式
- 已经被渗透测试者所使用
- 支持
1 |
|
总结
- 使用WAFNinja在测试环境中来尝试绕过三个waf
- 使用标准配置来配置waf
- 在每个waf后的web应用有两个漏洞
comodo WAF
- 是三个测试wafs中,规则最智能的
- sql注入载荷发现:
0 union/**/select 1,version(),@@datadir
- 发现敏感信息
modsecurity WAF
- 非常严格的规则
- 发现的sql注入payload:
1+uni%0Bon+se%0Blect+1,2,3
,
但是没有被后端服务器执行
aqtronix webknight waf
- 三个waf中规则漏洞最多的
- 发现了以下sql注入载荷:
0 union(select 1,@@hostname,@@datadir)
- 发现了敏感信息