17370845950

Burp Suite怎么构造XXE payload
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 自己先卡住了。

  • RepeaterIntruder 中右键请求 → 选择 Change request content-type,确保 Content-Typeapplication/xmltext/xml
  • 关闭 Editor → Show XML syntax highlighting(菜单栏),避免误报干扰
  • 手动输入 payload,不要依赖 Auto-completeInsert → XML 模板,那些默认不带外部实体声明

基础 XXE payload 要包含完整 DTD 声明和外部实体

多数 Web 应用用的是 libxml2Java 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,确认状态是 ActiveHTTPDNS 都勾选
  • payload 中用 SYSTEM "http://xxx.burpcoll

    aborator.net"
    ,不是 https(部分老解析器不支持)
  • 如果 Collaborator 没收到回调,检查目标是否禁用了 HTTP 外连(常见于内网环境),此时改用 ftp://xxx.burpcollaborator.net 可能触发 DNS 查询

Java 应用常见绕过:用 % 实体嵌套绕过 DTD 过滤

有些 WAF 或框架层会正则匹配 SYSTEMfile:// 等关键词。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 或响应体有没有变化。