Skip to content

Latest commit

 

History

History
57 lines (47 loc) · 4.07 KB

File metadata and controls

57 lines (47 loc) · 4.07 KB

将byte[]字节码转换为EL表达式字符串(ElConvert)

  • 类别:common 别名:— 优先级:未设置(null)
  • 作者:—
  • 依赖el(Jakarta/Java EL,如 tomcat-embed-el / javax.el,提供表达式求值能力)

作用

把内层 gadget 产出的 byte[] 字节码封装为一段 EL(Expression Language)表达式字符串:该表达式在被 EL 引擎求值时,借助脚本引擎(js)动态定义并加载这段字节码,从而在纯 EL 求值场景下执行任意字节码(通常配合 TemplatesImpl 风格的 defineClass 效果实现 RCE)。

链接标签

  • 入口 tagsEL_ExprExpression —— 承接上游「会对本字符串做 EL 求值」的 gadget(EL 求值型 sink)。
  • 衔接 nextTagsBytecodeConvertTag —— 之后须接一个产出 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),编码细节以其方法名与描述为准,不影响链路逻辑判断。

参数(@Param)

字段 名称 说明 默认值 可选值
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

关联

  • 上游(EL_Expr/Expression 求值型 sink):TomcatElRefXBeanToString 等,会把本 gadget 的字符串交给 EL 引擎求值。
  • 下游(nextTags=BytecodeConvertTag):BytecodeConvert 等产出 byte[] 的构件,其内层通常再接 Exec
  • 同族:ElExec(命令型 EL sink)。