- 类别:common 别名:— 优先级:未设置(null)
- 作者:—
- 依赖:
el(Jakarta/Java EL,如tomcat-embed-el/javax.el,提供表达式求值能力)
把内层 gadget 产出的 byte[] 字节码封装为一段 EL(Expression Language)表达式字符串:该表达式在被 EL 引擎求值时,借助脚本引擎(js)动态定义并加载这段字节码,从而在纯 EL 求值场景下执行任意字节码(通常配合 TemplatesImpl 风格的 defineClass 效果实现 RCE)。
- 入口
tags:EL_Expr、Expression—— 承接上游「会对本字符串做 EL 求值」的 gadget(EL 求值型 sink)。 - 衔接
nextTags:BytecodeConvertTag—— 之后须接一个产出byte[]字节码的构件(即BytecodeConvert家族),本 gadget 消费其字节码。 excludes:无。
@Param(name="是否包含括号", description="true/false", type=ParamType.Boolean)
public String bracket = "false";
private String getObject(byte[] obj) {
if (Boolean.parseBoolean(this.bracket)) {
return ExpressHelper.getElExpressWithBracket(obj);
}
return ExpressHelper.getElExpress(obj);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject((byte[])chain.doCreate(context));
}逐段解释:
chain.doCreate(context)先向内取值:按「链由内向外构建」的机制,先让内层构件(BytecodeConvert,见nextTags=BytecodeConvertTag)产出恶意byte[]字节码,强转为byte[]后交给getObject。getObject生成 EL 文本:委托给ExpressHelper.getElExpress(...)(或带括号版本getElExpressWithBracket)把字节码编码进一段 EL 表达式。按@GadgetAnnotation描述,其内部使用 js 脚本引擎实现加载字节码——即生成的 EL 会在求值时调用脚本引擎eval,在脚本里defineClass/实例化并触发字节码。bracket开关:false(默认)产出裸表达式文本(供${...}/#{...}之外、宿主自行拼接定界符的场景);true产出带界定括号的完整表达式,适配直接整体求值的 sink。ExpressHelper未随 gadget 反编译:该辅助类不在 中(属框架公共 util),编码细节以其方法名与描述为准,不影响链路逻辑判断。
| 字段 | 名称 | 说明 | 默认值 | 可选值 |
|---|---|---|---|---|
bracket |
是否包含括号 | 输出的 EL 是否自带界定括号(ParamType.Boolean,填 true/false) |
false |
true / false |
- 定位为「字节码 → EL 文本」的转换/桥接构件:把通用的
BytecodeConvert字节码接到任何 EL 求值型 sink 上。 - 依赖目标存在可用的 EL 实现与可访问的脚本引擎(js);高版本 JDK 若移除 Nashorn(JDK 15+)可能影响 js 加载字节码路径,需评估环境。
- 与 ElExec 的区别:
ElExec直接产出Runtime.exec(cmd)的命令型 EL(简单、无需内层字节码),本 gadget 走字节码加载路径(更隐蔽、可复用TemplatesImpl系字节码)。
usedInChains:
- C3P0反序列化2(
[MchangeC3p0Reference, TomcatElRef, ElConvert, BytecodeConvert, Exec]) - Hessian XBean 链(
[XBeanToString, TomcatElRef, ElConvert, BytecodeConvert, Exec]) - 经典 Tomcat EL 执行(
[TomcatElRef, ElConvert, BytecodeConvert, Exec])
- 上游(
EL_Expr/Expression求值型 sink):TomcatElRef、XBeanToString等,会把本 gadget 的字符串交给 EL 引擎求值。 - 下游(
nextTags=BytecodeConvertTag):BytecodeConvert 等产出byte[]的构件,其内层通常再接Exec。 - 同族:ElExec(命令型 EL sink)。