绕过web应用防火墙

以下内容是对该pdf的翻译:
《OWASP_Stammtisch_Frankfurt_-Web_Application_Firewall_Bypassing-_how_to_defeat_the_blue_team》

作者:Khalil Bijjou
译者:whale

前景提要
配置了waf的网站数量在增加
waf让渗透测试变得更加困难
在渗透测试中,绕过waf是一个重要的部分

对web应用防火墙的介绍

  1. 在安全层面保护web应用
  2. 配置在用户和web服务器交互的中间
  3. 比传统防火墙更理解HTTP交互
  4. 检查恶意交互然后阻止它

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