★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
`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` :
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!