绕过web应用防火墙

|
|除非已知安全的,其他的都拒绝|拒绝黑名单上的,其他都允许|
|预防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
4
X-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
2
3
asp.net -> productid=1,2
jsp -> productid=1
php -> productid=2

误匹配案例

以下的请求

?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’]“
  • 以下的请求:
1
http://www.website.com/index.php?uid=1+union/*&pid=*/select 1,2,3

将会导致以下sql查询

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
4
web服务器
编程语言
waf&安全模式
内网ip地址

阶段2:攻击预处理阶段
目标:使得waf省略输入验证

  • 确认http请求的那一部分会被waf检查,进而构造payload
1
2
3
发送只有某个部分不同的许多请求
发现哪个请求会被阻止
尝试构造一个exploit

阶段3:尝试一个误匹配
目标:使得waf和服务器解释请求不一样,从而不会检测到它

  • 需要知道服务段的技术

阶段4:绕过字符集
目标:发现一个payload,不会被waf规则集阻止

  • 暴力枚举,发送不同的payload
  • 对规则集进行逆向工程
1
2
3
发送对构造payload有用的字符和关键词
发现哪些会被阻塞
尝试构造一个exp基于以前步骤的结果

阶段5:确认各式漏洞
目标:发现其他不会被waf检测的漏洞

  • 失效的验证机制
  • 提权漏洞

阶段6:漏洞披露
目标:通知用户这些漏洞

  • 建议客户修复root权限导致的漏洞
  • 时间不充足时,漏洞/弱点应该被waf规则所保护
  • 解释waf可以帮助减轻漏洞危害,但不能修复它

WAFNinja

  • 用python写的命令行工具
  • 自动化的解决方式
  • 已经被渗透测试者所使用
  • 支持
1
2
3
https连接
getpost参数
对cookies的使用

总结

  • 使用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)
  • 发现了敏感信息