Apache Commons Configuration: 2.4 ~ 2.7
Apache Commons配置执行变量插值,允许属性被动态地评估和扩展。插值的标准格式是"${prefix:name}",其中 "prefix "用于定位执行插值的org.apache.commons.configuration2.interpol.Lookup的一个实例。从2.4版本开始,一直到2.7版本,默认的Lookup实例集包括可能导致任意代码执行或与远程服务器联系的插值器。这些查找器是 - “script” - 使用JVM脚本执行引擎(javax.script)执行表达式 - “dns” - 解析dns记录 - “url” - 从urls加载值,包括从远程服务器加载值 如果使用不受信任的配置值,使用受影响版本中的插值默认值的应用程序可能会受到远程代码执行或无意中与远程服务器接触的影响。建议用户升级到Apache Commons Configuration 2.8.0,该版本默认禁用了有问题的插值器。
java version “11” 2018-09-25
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-configuration2artifactId>
<version>2.7version>
dependency>
import org.apache.commons.configuration2.interpol.ConfigurationInterpolator;
import org.apache.commons.configuration2.interpol.InterpolatorSpecification;
public class Main {
public static void main(String[] args) {
InterpolatorSpecification specification = new InterpolatorSpecification.
Builder().
withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups()).
withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values()).
create();
ConfigurationInterpolator interpolator = ConfigurationInterpolator.fromSpecification(specification);
System.out.printf("%s", interpolator.interpolate("${env:Path}"));
}
}
运行,通过ConfigurationInterpolator.interpolate()
方法解析出表达式的值
解析表达式${script:javascript:java.lang.Runtime.getRuntime().exec('calc')}
进入方法ConfigurationInterpolator.interpolate()
,传入字符型的单一变量进入this.resolveSingleVariable()
解析变量
解析之前还有一步调用extractVariableName()
方法
该方法把${}
包裹的表达式的值截取出来了,之后就传入外层的this.reslove()
解析
首先截取出prefix:name
,然后调用this.fetchLookupForPrefix("script").lookup("javascript:java.lang...")
方法,也就是调用prefix对应插值器的lookup方法查找name对应的值
fetchLookupForPrefix("script")
获取了键script
对应的StringLookupAdapter
对象
实际对应的是ScriptStringLookup
对象,然后调用它的lookup方法
首先从传入的name中继续分割出engineName
和script
然后加载脚本引擎、调用对应引擎的eval方法执行name中的script脚本
这里直接加载了javascript的引擎,老套路了,eval直接就能执行java代码
Apache Commons Configuration生产中是用于对配置文件的操作,因此更多是通过读取配置文件RCE,前置条件还要写文件+获取配置文件路径,然后调用 ConfigurationInterpolator.interpolate(payload)
触发
官方推送了2.8.0版本修复了bug
把三个危险插值器移除了
Commons Configuration – Basic Features (apache.org)
commons-configuration2提供的变量占位符(Variable Interpolation)功能 - 腾讯云开发者社区-腾讯云 (tencent.com)
CVE - CVE-2022-33980 (mitre.org)
CVE-2022-33980: Apache Commons Configuration insecure interpolation defaults-Apache Mail Archives
oss-security - CVE-2022-33980:Apache Commons Configuration 不安全插值默认值 (openwall.com)
Commons Configuration – Apache Commons Configuration Release Notes
欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://blog.csdn.net/Xxy605/article/details/126114740
版权声明:本文为原创,转载时须注明出处及本声明