Skip to content

Latest commit

 

History

History
57 lines (43 loc) · 1.97 KB

File metadata and controls

57 lines (43 loc) · 1.97 KB

spring bean.xml 执行任意 SpEL 表达式(SpringBeanXmlSpEL)

  • 类别common 别名:— 优先级:20
  • 作者:—
  • 依赖spring-beanspel
  • 实现Gadget

作用

把内层 SpEL 表达式嵌入 Spring bean.xml。

链接标签

  • 入口 tagsOther
  • 衔接 nextTagsSpEL_Expr
  • excludes:无

源码剖析

关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:

public String getObject(String spelString) {
        String payload = String.format(template, spelString);
        HashMap<String, byte[]> fileMap = new HashMap<String, byte[]>();
        fileMap.put(CommonUtil.getRandomString(10) + ".xml", payload.getBytes());
        this.context.put(ContextTag.CACHE_FILES_MAP, fileMap);
        return payload;
    }

public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        this.context = context;
        return this.getObject((String)chain.doCreate(context));
    }

invoke() 从内层链取得 SpEL 字符串,调用 getObject(spelString)

getObject() 使用模板 <bean class="#{%s}"></bean> 把表达式放入 bean class 属性,随后把生成的 XML 以随机 .xml 文件写入 ContextTag.CACHE_FILES_MAP

本构件自身不决定表达式内容,真正能力来自衔接的 SpEL_Expr 标签下游。

参数(@Param)

本类无 @Param,运行时输入来自链上下文或内层 gadget。

适用版本与原理要点

  • 注解描述:适用于ClassPathXmlApplicationContext加载xml文件场景
  • 依赖条件:spring-beanspel
  • 需要目标 Spring 解析 XML 时启用 SpEL 表达式求值,并存在可达的表达式 sink。
  • 可衔接下一环:SpEL_Expr

防御与检测

关注 Spring XML 中 class="#{...}" 和随机缓存 XML 文件。

所属预设链

自由构件,未直接出现在预设链中。

关联

  • 机器可读元数据:index/gadgets.json
  • 完整反编译源码:。