Skip to content

Latest commit

 

History

History
56 lines (46 loc) · 3.93 KB

File metadata and controls

56 lines (46 loc) · 3.93 KB

自定义Java反序列化数据(UserCustomSerializeData)

  • 类别:common 别名:— 优先级:未设置(null)
  • 作者:—
  • 依赖commons-codecorg.apache.commons.codec.binary.Base64,工具类,通常随框架自带)

作用

把用户提供的 Base64 字符串解码为 byte[] 并返回。用作「内层数据源」构件:在二次反序列化等场景中,由外层包装 gadget(SignedObjectRMIConnectorMapMessage 等)把这段字节数组当作嵌套的 Java 序列化数据携带,实现自带任意序列化 payload。

链接标签

  • 入口 tagsOtherCustomJavaDeserializeEND
    • CustomJavaDeserialize —— 表示「一段自定义的 Java 序列化字节」,专供 nextTags 含该标签的二次反序列化包装器承接。
    • Other —— 杂项/通用标签。
    • END —— 链尾,nextTags 为空,不再向内包装。
  • 衔接 nextTags:无。
  • excludes:无。

源码剖析

@GadgetTags(tags={"Other", "CustomJavaDeserialize", "END"})
@GadgetAnnotation(name="自定义Java反序列化数据", description="可自定义传入Base64格式的Java序列化数据,用于一些二次反序列化场合")
public class UserCustomSerializeData implements Gadget {
    @Param(name="Base64格式的Java序列化数据")
    public String data;

    public Object getObject() {
        return Base64.decodeBase64((String)this.data);
    }

    @Override
    public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        return this.getObject();
    }
}

逐段解释:

  • 单步解码getObject() 调用 org.apache.commons.codec.binary.Base64.decodeBase64(data),把用户输入的 Base64 文本还原为原始 byte[]invoke 不消费任何内层对象(END)。
  • 产物是字节,不是对象:返回类型虽为 Object,实际是 byte[]。它不会在本机被反序列化,而是作为「打包好的序列化数据」交给外层 gadget 嵌入。
  • 二次反序列化定位:外层包装器(如 SignedObject:把内层 byte[] 封进 SignedObjectRMIConnector/MapMessage/MapProxy:塞入各自触发二次 readObject 的字段)在目标端被反序列化后,会对这段 byte[] 再次执行 ObjectInputStream.readObject,从而在受害进程内触发使用者自备的任意链。

参数(@Param)

字段 名称 说明 默认值 可选值
data Base64格式的Java序列化数据 一段已序列化好的 Java 对象(ObjectOutputStream 输出)经 Base64 编码后的文本 无(必填)

适用版本与原理要点

  • 无版本约束——纯 Base64 解码;可利用性取决于所嵌入序列化数据本身及目标是否存在二次反序列化点。
  • 典型用途:当框架内置链无法覆盖目标环境时,用户先用其他工具(如 ysoserial)生成序列化 payload,再经本 gadget 注入到二次反序列化包装器中。
  • UserCustomExpr 同属「自定义原料」家族:本类产 byte[](序列化数据),后者产 String(表达式)。

所属预设链

usedInChains 为空——自由构件,未直接出现在预设链。在预设的二次反序列化链(如 K1链二次反序列化、Rome 二次反序列化)中,它可替换掉内层「真正产出恶意对象」的那一段,改为直接投递现成序列化字节。

关联

  • 上游(nextTags=CustomJavaDeserialize,消费本 byte[] 的二次反序列化包装器):SignedObjectRMIConnectorMapMessageMapProxyLazyValueWithDS/LazyValueWithDS2/LazyValueWithDS3C3p0_C3p0HexSerializeMchangeC3p0HexSerializeHsqldbHexDeserJdbcJavaBeanObjectFactoryHexDSAxis2MetaDataEntryObf 等。
  • 同族/替代:UserCustomExpr(自定义表达式字符串版本)。