前言
在 i春秋的漏洞靶标上看见了此漏洞,所以前来分析一下漏洞原理,比较也是去年 7月的漏洞。
漏洞描述:Apache官方发布安全公告,修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞,漏洞编号:CVE-2022-33980,漏洞威胁等级:高危。恶意攻击者通过该漏洞,可在目标服务器上实现任意代码执行。
什么是Commons Configuration
Commons Configuration是一个java应用程序的配置管理类库。可以从properties或者xml文件中加载软件的配置信息,用来构建支撑软件运行的基础环境。在一些配置文件较多较的复杂的情况下,使用该配置工具比较可以简化配置文件的解析和管理。也提高了开发效率和软件的可维护性。
利用范围
2.4 <= Apache Commons Configuration <=2.7
官方通报:
从2.4版到2.7版,默认的Lookup实例集包括可能导致任意代码执行或与远程服务器联系的插值器。如公告中提到“script” 可使用JVM脚本执行引擎(javax.script)执行表达式,若使用了不受信任的配置值,在受影响的版本中使用插值默认值的应用程序就很可能受到远程代码执行的影响。
这个CVE的漏洞点是在变量插值中造成的
前置知识
那么什么是变量插值呢?
在 commons-configuration2
来说,变量插值,就类似于引用动态变量的方式,就好比,如果我们需要获取系统中的某个环境变量,我们可以在配置文件中使用${env:envname}
, 如果需要获取用户根目录,同样可以通过 ${sys:user.home}
漏洞分析
环境依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
<version>2.7</version>
</dependency>
我们可以跟进下源码 看看 ${sys:user.home},这种写法是如何解析的,
在
org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate 中对这种写法进行解析,赋予其对应的值
此方法的解释是:
对于变量的插值,如果这个值他是字符串类型的,他将会检查时候包含有变量,