- 类别:common 别名:— 优先级:未设置(null)
- 作者:—
- 依赖:无(纯字符串透传,运行时依赖取决于目标表达式引擎)
把用户手写的任意表达式字符串原样返回,交给上游表达式求值型入口执行。是一个「万能表达式占位」构件:当内置的各类 *Convert/*Exec 模板不满足需求时,用它直接投递自定义 payload(SpEL、OGNL、EL、Groovy、Velocity、Freemarker、Aviator、MVEL、JEXL、BCEL 字符串、SnakeYaml 等均可)。
- 入口
tags:BCEL_Expr、Beanshell_Expr、Groovy_Expr、SpEL_Expr、Js_Expr、Velocity_Expr、Ongl_Expr、EL_Expr、Mvel_Expr、Aviator_Expr、Jxel_Expr、Freemarker_Expr、SnakeYaml_Expr、Expression、END- 一次性声明了所有表达式方言的入口标签,因此凡是消费某种
*_Expr或通用Expression的上游入口/Payload 都能承接本 gadget——由用户自行保证所填字符串与目标引擎语法匹配。 Expression—— 被ExpressionPayload(gadgetTags={"Expression"})直接消费。END—— 链尾 sink,nextTags为空。
- 一次性声明了所有表达式方言的入口标签,因此凡是消费某种
- 衔接
nextTags:无。 excludes:无。
@GadgetTags(tags={"BCEL_Expr", "Beanshell_Expr", "Groovy_Expr", "SpEL_Expr", "Js_Expr", "Velocity_Expr", "Ongl_Expr", "EL_Expr", "Mvel_Expr", "Aviator_Expr", "Jxel_Expr", "Freemarker_Expr", "SnakeYaml_Expr", "Expression", "END"})
@GadgetAnnotation(name="自定义表达式字符串")
public class UserCustomExpr implements Gadget {
@Param(name="表达式字符串", description="无需base64编码")
public String expression;
private String getObject() {
return this.expression;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}
}逐段解释:
- 零逻辑透传:
getObject()直接返回字段expression,invoke不调用chain.doCreate,也不做任何转义或编码——@Param描述明确「无需 base64 编码」,即所填即所用。 - 可插拔的定位:由于同时挂了 13 种
*_Expr标签,它在标签图中充当各表达式链的通用尾节点,供框架 UI 在「表达式注入」类 Payload 下拉里始终可选。 - 风险自负:因为不校验语法与危险性,表达式的可利用性、绕过与回显完全由使用者构造,本类只负责搬运。
| 字段 | 名称 | 说明 | 默认值 | 可选值 |
|---|---|---|---|---|
expression |
表达式字符串 | 直接投递给上游求值入口的原始表达式,无需 base64 编码 | 无(必填) | — |
- 与目标引擎无关的「原料」构件:适配性来自用户输入,而非代码逻辑。
- 适合场景:内置模板被 WAF/白名单拦截需手工绕过、目标为框架未覆盖的表达式方言、或需要一次性投递调试用 payload。
- 与 UserCustomSerializeData 属同一「自定义原料」家族:前者产 String(表达式),后者产 byte[](序列化数据)。
usedInChains 为空——自由构件,未直接出现在预设链。作为各表达式注入 Payload 的手工根节点使用。
- 上游(消费本字符串的求值入口):
ExpressionPayload,以及各语言的求值型 sink/入口(TomcatElRef、GroovyShellRef、SnakeyamlRef、MvelRef等,视所填方言而定)。 - 同族/替代:ElExec、ThymeleafExec(内置命令模板)、各
*Convert(字节码型表达式构件)、UserCustomSerializeData(自定义序列化数据版本)。