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 漏洞分析
- 进入靶机环境:
docker exec -it eb /bin/bash
- 将靶机中打包的ROOT.war文件拉去到本机中:
docker cp /usr/local/tomcat/webapps/ROOT.war /home/test
- 解压文件,会看到网站打包好的源码
- 使用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方法的调用
他首先会通过:
将其进行分隔开来,并判断了其格式,再分别取出了engineName
和script
之后,将会在后面通过调用getEngineByName
方法的调用传入engineName
,得到了scriptEngine
为NashormScriptEngine
类
带入了script和context
对象继续调用eval方法,而我们知道eval函数可计算某个字符串,并执行其中的的JavaScript 代码。
最后在java.lang.Runtime.getRuntime().exec()方法打下断电,就可以查看到完整的调用栈
0x05 漏洞复现
访问映射的端口,发现有一个输入框
输入命令${script:javascript:java.lang.Runtime.getRuntime().exec("touch /tmp/success")}
查看服务器中,已经生成了目录
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhghaggg
-
JavaWeb实现文件上传和下载
-
解决Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources......
-
PageOffice在线编辑office文件和Apache POI的区别
-
Apache HTTP Server <2.4.56 mod_proxy 模块存在请求走私漏洞CVE-2023-25690
-
dolphinscheduler 3.0.1代码下载编译和部署
-
Exception in thread “main“ java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$PO
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13