CVE-2022-33980 Apache Commons Configuration 遠程命令執行漏洞
漏洞信息

`Apache Commons Configuration` 執行變量插值,允許動態評估和擴展屬性。插值的標準格式是 `${prefix:name}` ,其中 `prefix` 用于定位執行插值的 `org.apache.commons.configuration2.interpol.Lookup` 實例。從 `2.4` 版開始到 `2.7` 版,默認的 `Lookup` 實例集包括可能導致任意代碼執行或與遠程服務器聯系的插值器。
漏洞分析
通常我們用 `Commons Configuration` 來管理配置文件,在 `Commons Configuration` 管理的配置文件中,配置變量的值可以引用變量,比如在配置文件中 `${env:FLAG}` 就表示取環境變量 `FLAG` 的值,這種引用動態變量的方式叫做變量插值。
通過查閱資料和調試研究, 發現 `org.apache.commons.configuration2.interpol.ConfigurationInterpolator` 類中的 `interpolate` 函數負責進行變量解析。結合漏洞通報信息,我們構造形如 `${script:test}` 的插值字符串:

進入 `resolveSingleVariable` :

`extractVariableName` 函數用于提取變量名,然后進入 `resolve` :

根據 `:` 分割字符串獲取 `prefix` 和 `name` ,`fetchLookupForPrefix` 函數獲取到 `ScriptStringLookup` 對象:

接著進入 `ScriptStringLookup#lookup` 函數:

再次利用 `:` 分割字符串獲取 `engineName` 和 `script`(測試用的 `test` 不符合格式要求直接拋出異常)。接著利用 `getEngineByName` 獲取腳本引擎對象 `ScriptEngine` ,第 35 行將調用 `eval` ,看到這里小伙伴們應該明白如何觸發 RCE 漏洞了。
漏洞復現
根據前面的分析,我們很容易構造新的插值字符串格式:


修復方式

直接移除了 `script` 、 `dns` 和 `url` :
