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` :
