从最近的微信支付看XXE漏洞
字数 935 2025-08-18 11:37:23
XML外部实体注入(XXE)漏洞分析与防御指南
1. XXE漏洞概述
XML外部实体注入(XXE)是一种安全漏洞,攻击者能够通过操纵XML文档中的外部实体声明来读取服务器上的任意文件,执行远程请求,甚至可能导致服务器端请求伪造(SSRF)。
2. 漏洞原理
XXE漏洞发生在应用程序解析XML输入时,未正确配置XML解析器,导致允许处理外部实体。攻击者可以构造恶意XML文档,通过外部实体引用访问系统资源。
3. 漏洞复现
3.1 微信支付SDK漏洞案例
微信支付Java SDK中的WXPayUtil.xmlToMap方法存在XXE漏洞,攻击者可构造如下恶意XML:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY>
<!ENTITY xxe SYSTEM 'file:///c:/windows/win.ini'>
]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
当解析此XML时,服务器会读取C:/windows/win.ini文件内容并返回给攻击者。
4. 漏洞危害
- 读取服务器敏感文件(如配置文件、密码文件等)
- 实现0元支付(获取支付加密密钥后)
- 导致服务器端请求伪造(SSRF)
- 可能的拒绝服务攻击
5. 防御措施
5.1 完全禁用DTDs(推荐)
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
5.2 禁用外部实体引用
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
5.3 不推荐的防御方式
- 关键词过滤(如ENTITY、DOCTYPE):容易被绕过(如ENTIENTITYTY)
- 仅设置
secure-processing属性:不能完全防御XXE
6. 不同XML解析器的防御配置
6.1 原生SAX解析器
SAXParserFactory sf = SAXParserFactory.newInstance();
sf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
6.2 Dom4j解析器
SAXReader reader = new SAXReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
6.3 JDOM解析器
SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
7. 静态代码审计注意事项
- 仅生成XML而不解析不会导致XXE漏洞
- 应检查XML解析点而非仅检查XML生成点
- 判断是否存在解析XML的情况
- 检查是否设置了安全属性
- 评估Source是否安全
8. 最佳实践
- 优先使用完全禁用DTDs的方式
- 如果业务需要DTD功能,必须严格禁用外部实体
- 定期进行安全审计,特别是XML处理组件
- 保持XML解析库更新到最新版本
- 对用户提供的XML输入进行严格验证
9. 总结
XXE漏洞危害严重,但防御措施相对简单明确。开发人员应充分了解XML处理的安全配置,安全人员在进行代码审计时应关注XML解析点的安全配置,而非仅关注XML生成点。微信支付SDK的案例表明,即使是大型企业的代码也可能存在此类基础安全问题,因此安全意识和安全开发实践至关重要。