作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/iAEDu3noxYvZ6xhxeN-reA
漏洞描述
7月6日,Apache官方發布安全公告,修復了一個存在于Apache Commons Configuration 組件的遠程代碼執行漏洞,漏洞編號:CVE-2022-33980,漏洞威脅等級:高危。惡意攻擊者通過該漏洞,可在目標服務器上實現任意代碼執行。
相關介紹
Apache Commons Configuration是一個Java應用程序的配置管理工具,可以從properties或者xml文件中加載軟件的配置信息,用來構建支撐軟件運行的基礎環境。在一些配置文件較多較復雜的情況下,使用該配置工具比較可以簡化配置文件的解析和管理,提高開發效率和軟件的可維護性。
利用范圍
2.4 <= Apache Commons Configuration <=2.7
漏洞分析
前置知識
什么是變量插值?
通常我們用apache的configuration2庫來管理配置文件(org.apache.commons:commons-configuration2),在commons-configuration2管理的配置文件中,配置變量的值可以引用變量。舉個例子:${env:xxhzz}就指代環境變量xxhzz,在commons-configuration2中這種引用動態變量的方式就叫變量插值。
變量插值解析:在commons-configuration2中,負責對字符串中的變量進行解析的是org.apache.commons.configuration2.interpol.ConfigurationInterpolator類中的interpolate(Object)方法。
漏洞原理

從漏洞通告中,可以得知Apache Commons Configuration執行變量插值,允許動態評估和擴展屬性。插值的標準格式是“${prefix:name}”,其中“prefix”用于定位執行插值的org.apache.commons.configuration2.interpol.Lookup 實例。
從2.4版到2.7版,默認的Lookup實例集包括可能導致任意代碼執行或與遠程服務器聯系的插值器。如公告中提到“script” 可使用JVM腳本執行引擎(javax.script)執行表達式,若使用了不受信任的配置值,在受影響的版本中使用插值默認值的應用程序就很可能受到遠程代碼執行的影響。
環境搭建
了解了漏洞原理后,為更好理解漏洞的形成,需構建一個調試的demo環境。
通過maven直接引入Apache Commons Configuration2.7。

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
<version>2.7</version>
</dependency>
接著構建一個觸發漏洞的主類即可

動態調式
在對插值變量進行解析的地方打下斷點。
org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate

開啟debug模式,在經過了前兩個if判斷之后,隨后會進入resolveSingleVariable函數。

在org.apache.commons.configuration2.interpol.ConfigurationInterpolator#resolveSingleVariable中首先跟一下extractVariableName函數。

org.apache.commons.configuration2.interpol.ConfigurationInterpolator#extractVariableName的作用是提取變量字符串strValue。

隨后進入org.apache.commons.configuration2.interpol.ConfigurationInterpolator#resolve函數中
通過index0f查找和判斷條件,從變量字符串中分別獲取到prefix和name。

繼續跟進會進入lookup函數。

在分析lookup函數前先跟進下fetchLookupForPrefix函數。

fetchLookupForPrefix函數的作用是獲取到stringLookup對象。
繼續跟進,會進入commons-text-1.8.jar包中的org.apache.commons.text.lookup.ScriptStringLookup#lookup函數。

在org.apache.commons.text.lookup.ScriptStringLookup#lookup函數中會再次對字符串進行分割,分別提取engineName和script。

接著會通過getEngineByName函數獲取ScriptEngine(javax.script)。

繼續往下,出現eval函數。
而我們知道eval函數可計算某個字符串,并執行其中的的JavaScript 代碼。

繼續往下將成功觸發我們傳入的payload,造成遠程命令執行。
漏洞復現

成功命令執行。

修復建議
目前官方已發布修復版本修復了該漏洞,請受影響的用戶升級到 Apache Commons Configuration 2.8.0 版本。
https://commons.apache.org/proper/commons-configuration/download_configuration.cgi
參考材料
1.https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s
2.https://cloud.tencent.com/developer/article/1650833
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2001/
暫無評論