Skip to content

Latest commit

 

History

History
56 lines (46 loc) · 3.82 KB

File metadata and controls

56 lines (46 loc) · 3.82 KB

自定义表达式字符串(UserCustomExpr)

  • 类别:common 别名:— 优先级:未设置(null)
  • 作者:—
  • 依赖:无(纯字符串透传,运行时依赖取决于目标表达式引擎)

作用

把用户手写的任意表达式字符串原样返回,交给上游表达式求值型入口执行。是一个「万能表达式占位」构件:当内置的各类 *Convert/*Exec 模板不满足需求时,用它直接投递自定义 payload(SpEL、OGNL、EL、Groovy、Velocity、Freemarker、Aviator、MVEL、JEXL、BCEL 字符串、SnakeYaml 等均可)。

链接标签

  • 入口 tagsBCEL_ExprBeanshell_ExprGroovy_ExprSpEL_ExprJs_ExprVelocity_ExprOngl_ExprEL_ExprMvel_ExprAviator_ExprJxel_ExprFreemarker_ExprSnakeYaml_ExprExpressionEND
    • 一次性声明了所有表达式方言的入口标签,因此凡是消费某种 *_Expr 或通用 Expression 的上游入口/Payload 都能承接本 gadget——由用户自行保证所填字符串与目标引擎语法匹配。
    • Expression —— 被 ExpressionPayloadgadgetTags={"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() 直接返回字段 expressioninvoke 不调用 chain.doCreate,也不做任何转义或编码——@Param 描述明确「无需 base64 编码」,即所填即所用。
  • 可插拔的定位:由于同时挂了 13 种 *_Expr 标签,它在标签图中充当各表达式链的通用尾节点,供框架 UI 在「表达式注入」类 Payload 下拉里始终可选。
  • 风险自负:因为不校验语法与危险性,表达式的可利用性、绕过与回显完全由使用者构造,本类只负责搬运。

参数(@Param)

字段 名称 说明 默认值 可选值
expression 表达式字符串 直接投递给上游求值入口的原始表达式,无需 base64 编码 无(必填)

适用版本与原理要点

  • 与目标引擎无关的「原料」构件:适配性来自用户输入,而非代码逻辑。
  • 适合场景:内置模板被 WAF/白名单拦截需手工绕过、目标为框架未覆盖的表达式方言、或需要一次性投递调试用 payload。
  • UserCustomSerializeData 属同一「自定义原料」家族:前者产 String(表达式),后者产 byte[](序列化数据)。

所属预设链

usedInChains 为空——自由构件,未直接出现在预设链。作为各表达式注入 Payload 的手工根节点使用。

关联

  • 上游(消费本字符串的求值入口):ExpressionPayload,以及各语言的求值型 sink/入口(TomcatElRefGroovyShellRefSnakeyamlRefMvelRef 等,视所填方言而定)。
  • 同族/替代:ElExecThymeleafExec(内置命令模板)、各 *Convert(字节码型表达式构件)、UserCustomSerializeData(自定义序列化数据版本)。