// 红队渗透 · 2025-01-11

绕WAF的经验总结与技巧

在现代渗透测试中,WAF(Web应用防火墙)已成为阻挡黑客入侵的主要防御机制之一。然而,尽管WAF可以有效地防止许多常见的攻击,但它也并非无懈可击,WAF的设计目标在机制上决定了其不可能是完美的。


一、绕WAF的原理

WAF的设计目标是拦截恶意攻击,同时确保业务正常运行,这就决定了其检测方式的局限性。大部分WAF都采用黑名单方式检测恶意请求,且通常会依赖预设的规则和模式进行拦截。这使得WAF在一些情况下仍易被绕过。

绕过WAF的本质就在于利用WAF检测的缺陷以及WAF与HTTP协议解析的差异。通过灵活运用各种语言的冷门特性,攻击者可以巧妙地绕过WAF的检测机制。


二、常见漏洞绕WAF的可行性比较

在渗透测试中,有些漏洞尤其容易受到WAF的拦截,而另一些则能够通过特定的技巧被绕过。以下是对几种常见漏洞绕WAF的可行性分析:

1. SSRF(服务器端请求伪造)

SSRF攻击通常会被WAF严格防范,大多数WAF能够有效拦截此类攻击。一般来说,攻击者会尝试多种变种,比如使用不同的协议或IP地址格式(如http://127.0.0.1与http://localhost的不同),但是大部分WAF能够做到精确过滤,因此绕过的难度较大。

2. XXE(外部实体注入)

XXE攻击依赖于XML解析器的配置不当,WAF对XXE的防护也通常较强。虽然可以尝试使用一些绕过方式,如UTF-7或UTF-16编码进行绕过,但实际成功率较低。这是因为主流WAF基本上都能识别不同的编码。

3. 文件上传绕过

文件上传绕过是一个经典的渗透测试场景。关于这一点,安全客有篇文章已经有非常详细的分析,建议读者参考其内容。常见的绕过方式包括伪造文件扩展名、修改文件头、利用特殊字符等。

4. SQL注入绕过

SQL注入是最常见的攻击方式之一,尽管WAF通常能够识别常见的SQL注入攻击模式,但针对SQL注入的多种变形依然可以绕过一些防护机制。因此,SQL注入绕过是渗透测试中的一项重点。以下部分将重点介绍SQL注入的常见绕过技巧。

综上所述,SQL注入和文件上传绕过是渗透测试中最常见的绕过场景,由于这两种攻击方法的变种非常多,因此WAF很难做到百分百的防护。


三、SQL注入绕过技巧

1. 注释内容绕过

WAF通常会检查请求中的注释符号,如/**/、/*!*/、--以及%23(#符号)。然而,许多WAF仅拦截前两种常见的注释符号,对于其他形式的注释识别较弱。因此,攻击者可以尝试通过构造特殊的注释内容绕过WAF。例如,可以利用%0A(换行符)来制造不易识别的注释:

%23/*%0Aunion%23%*/0Aselect

这里的%23代表#符号(注释符),%0A代表换行符,巧妙地将注释嵌入SQL语句中,从而绕过WAF的检查。

2. 利用非空白符绕过

在SQL注入中,特殊字符(如%00、%01、%02等)能够用作SQL语句中的非空白符。不同数据库对这些字符的处理方式有所不同,攻击者可以通过这些字符绕过一些WAF的检测。常见的应用场景如下:

  • 在Oracle中,%00可以作为空白符。
  • 在MSSQL中,%01-%08等字符可以当作空白符。
  • 在Linux MySQL中,%A0可以作为空白符。

利用这些字符,攻击者可以让WAF无法正确解析SQL语句。

3. HTTP传输方式绕过

分块传输(chunked transfer encoding)和脏数据是绕WAF的两种经典但十分有效的手段,但这两种方法仅限于POST请求中使用。

4. SQL关键词变形

常见的SQL关键词(如union select from、database()等)是WAF重点防护的对象。然而,攻击者可以通过对这些关键词进行变形来绕过WAF。例如:

  • database/**/(%0A)可以绕过一些WAF的检测。
  • 在union前加上0e0,如0e0union,通过无效字符扰乱WAF的识别。
  • 在select后添加变形字符,如select-1、select@1、select{x%201}等,来误导WAF。
  • 在from前插入特殊字符,如select%201,\Nfrom,进一步干扰WAF的检测。

通过灵活运用SQL语法和字符编码,可以有效地绕过WAF的拦截。

5. 同义语替代

针对常见的SQL函数(如database()),可以尝试使用同义语绕过,这就要靠大家对语言特性的掌握程度和平时积累的冷门函数了。

如果尝试的绕过方法仍然无效,可以考虑放弃当前注入点,寻找其他绕过的机会。


四、总结与建议

绕过WAF的过程需要详细分析WAF的行为,并找出其防御漏洞。通过巧妙地利用注释符、分块传输、非空白符、SQL关键词变形等技巧,渗透测试人员可以绕过WAF的部分防护。然而,如果WAF的检测机制非常严格,甚至能拦截如aaaaaaunionaaaaaaaaselectaaa这样的非常规SQL注入形式,此时可能需要考虑放弃该注入点,寻找其他攻击路径。

需要特别注意的是,不同WAF对不同漏洞的拦截力度不同,如宝塔WAF在拦截SQL注入时就严格,导致无法绕过,而遇到安全狗时就值得一试。这提醒我们在渗透测试中应不断调整绕过策略,灵活应对不同类型的WAF。

希望本文的绕过技巧能够为渗透测试人员提供帮助,提升攻击成功率。在实际测试中,我们应根据不同WAF的特点,选择适合的绕过方法,并结合环境灵活应对。

原文 https://blog.csdn.net/2301_79518550/article/details/145080550