绕过WAF保护的XXE
字数 1312 2025-08-26 22:11:15
XXE漏洞绕过WAF保护技术详解
一、XXE漏洞概述
XXE(XML External Entity)即XML外部实体注入,是2017年OWASP Top 10中新引入的安全问题。这种漏洞源于XML解析器处理外部实体的方式,允许攻击者通过精心构造的XML文档读取服务器上的任意文件,甚至可能导致服务器端请求伪造(SSRF)、远程代码执行等严重后果。
XML文档结构
一个典型的包含攻击代码的XML文档分为三部分:
- 可选标头:
<?xml?>定义文档版本和编码等基本特征 - 可选声明:
<!DOCTYPE>设置外部链接 - 文档正文:具有层次结构的标签内容
二、WAF防护类型分析
1. 成熟的WAF
使用自己的解析器预处理XML文档,通常会:
- 验证XML结构
- 检查外部实体引用
- 限制危险操作
2. 基于正则表达式的WAF
仅搜索特定子字符串或正则表达式匹配,通常:
- 检查文档开头是否有危险模式
- 使用简单的字符串匹配规则
- 缺乏完整的XML解析能力
三、绕过WAF的技术方法
方法1:文档中插入额外空格
原理:利用XML格式允许在标记属性间使用任意数量空格的特性
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [<!ENTITY % xxe SYSTEM "file:///etc/passwd"> %xxe;]>
防御:WAF应完整解析文档而非仅检查开头
方法2:格式无效攻击
链接到未知实体
原理:成熟的WAF通常不读取链接文件内容,导致无法识别实体声明
示例:
<!DOCTYPE root [
<!ENTITY % unknown "file:///etc/passwd">
%unknown;
]>
防御:配置WAF中的XML解析器在遇到未知实体后不关闭
方法3:外来编码(Exotic encodings)
原理:利用WAF可能不支持的编码方式
支持的编码类型:
- UTF-8
- UTF-16(BE和LE两种变体)
- UTF-32(BE、LE、2143、3412四种变体)
- EBCDIC
示例:使用UTF-16BE编码的文档可能绕过仅配置UTF-8正则表达式的WAF
防御:WAF需支持所有可能的XML编码
方法4:混合编码攻击
原理:在文档中使用两种不同编码,利用解析器处理差异
解析器行为差异:
- Java解析器(javax.xml.parsers):在
<?xml?>结束后切换编码 - libxml2解析器:可能在处理"encoding"属性值后切换编码
示例1:libxml2有效但Java无效的文档
<?xml version="1.0" encoding="UTF-16BE"?><root/>
示例2:Java有效但libxml2无效的文档
<?xml version="1.0" encoding="UTF-8"?>
<root/>
示例3:libxml2文档,在标记中从utf-16le切换为utf-16be
<?xml version="1.0" encoding="utf-16le"?>
<root/>
示例4:libxml2文档,从utf-8切换为ebcdic-us
<?xml version="1.0" encoding="utf-8"?>
<root/>
防御:统一编码处理标准或拒绝混合编码文档
四、根本防御措施
-
禁用外部实体:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); -
禁用外部DTD架构:
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); -
使用安全的XML处理器:如OWASP推荐的XML安全配置
-
实施多层防御:
- WAF规则更新
- 应用程序层防护
- 运行时保护
五、总结
XXE漏洞防护需要综合考虑WAF规则和应用程序自身安全配置。攻击者可以通过多种方式绕过单一防护措施,包括空格插入、格式混淆、编码转换等技术。最有效的防护是在应用程序层面禁用危险特性,同时配合WAF的多层次检测。
关键防护原则:
- 最小化XML解析器的功能
- 保持WAF规则与最新绕过技术同步
- 实施深度防御策略
- 定期进行安全测试和代码审计