在现代渗透测试中,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的特点,选择适合的绕过方法,并结合环境灵活应对。