0%

WAF的一些绕过方法

WAF的一些绕过方法

WAF 全称为「Web应用防火墙」(Web Application Firewall),是网站常用来保护Web应用安全的一种安全产品。主要功能是通过检测客户端的请求内容,对具有潜在危险性的请求进行拦截,可以有效防御一些常见的针对 Web 应用的攻击(SQL注入、XSS、……)。

现在的中、大型网站基本都部署了 WAF 产品,作为一名渗透测试人员,如果没有掌握 WAF 的基本绕过方法,在渗透测试过程中会举步维艰。本文列举了一些常见的 WAF 绕过方法。

HTTP 参数污染

  • 由于 HTTP 协议允许同名参数存在,如果 WAF 对同名参数的处理方式不当,就会造成「参数污染」。
    假设提交的参数为id=1&id=2&id=3,WAF 可能会解析为id=1,而后端的解析结果可能是id=3,这时候攻击者只需要把攻击内容放在第三个参数即可绕过 WAF 的检测。
    这个方法非常古老了,现在已经基本行不通了,列出来只是为了提供一种思路。

HTTP Header头欺骗

  • 有时候 WAF 会放行特定来源(比如本地 IP 地址)的请求包,这时候就可以通过伪造请求包的来源地址来绕过 WAF。相关 HTTP 报文字段:

    字段
    X-Origination-IP 127.0.0.1
    X-Forwarded-For 127.0.0.1
    X-Remote-IP 127.0.0.1
    X-Remote-Addr 127.0.0.1
    X-Client-IP 127.0.0.1
    X-Real-IP 127.0.0.1

HTTP 参数溢出

这个方法和「参数污染」有点相似。

  • 一些 WAF 出于对性能的考虑,对一些参数非常多的请求只会检测其中一部分(比如前100个)参数,攻击者可以制造大量的无关参数用来「占位」,把真正的恶意参数放在后面。WAF 检测完前面一部分参数后没有发现问题,就放行了这个请求,这时候攻击者就成功绕过了 WAF 的检测,把恶意参数带入了后端。

  • 同样是出于对性能的考虑,一些 WAF 对于超长(超大)的数据包也会跳过(不检测)。

HTTP 分块传输(Chunked)

「分块传输」(Chunked Transfer Coding)是一种传输编码,把报文分割成若干个大小已知的「块」进行传输。

  • 在请求报文的Transfer-Encoding字段中指定为chunked值来声明采用「分块传输」,把数据分割成若干份来绕过 WAF 的检测。

HTTP 数据编码(Charset)

利用报文头Content-Type指定一个特殊编码,使服务器可以正常解析但 WAF 无法解析请求包内容,从而绕过 WAF。

HTTP Pipline(Kepp-Alive)

HTTP 管道化允许多个 HTTP 请求通过一个套接字同时被输出,而不用等待相应的响应。然后请求者会等待各自的响应,这些响应是按照之前的请求顺序依次到达。因为多个请求可被同时传送,如果 WAF 只检测第一个请求而忽略了后面的请求,就可以被绕过。

HTTP 协议未覆盖

通过修改参数提交方式导致 WAF 使用错误的方式检测请求内容,从而绕过 WAF。

HTTP 畸形包

当前的 HTTP 服务依据的是 RFC2616 标准(通常有以下八种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT)的 HTTP 请求,但是当向 Web 服务器发送畸形请求(非标准的 HTTP 数据包)时,由于 Web 服务器的一些兼容性的特性,会尽力解析这些畸形的数据包,而 WAF 处理这种畸形包时就可能不拦截。

HTTP 组合绕过

以上列举的方法并不是一定要独立使用,可以灵活地根据情况组合使用,成功绕过的机率也会提高。

更多关于绕过 WAF 的方法,推荐阅读这篇文章