- 类别:common 别名:— 优先级:未设置(null)
- 作者:—
- 依赖:
commons-codec(org.apache.commons.codec.binary.Base64,工具类,通常随框架自带)
把用户提供的 Base64 字符串解码为 byte[] 并返回。用作「内层数据源」构件:在二次反序列化等场景中,由外层包装 gadget(SignedObject、RMIConnector、MapMessage 等)把这段字节数组当作嵌套的 Java 序列化数据携带,实现自带任意序列化 payload。
- 入口
tags:Other、CustomJavaDeserialize、ENDCustomJavaDeserialize—— 表示「一段自定义的 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[] 封进SignedObject;RMIConnector/MapMessage/MapProxy:塞入各自触发二次readObject的字段)在目标端被反序列化后,会对这段byte[]再次执行ObjectInputStream.readObject,从而在受害进程内触发使用者自备的任意链。
| 字段 | 名称 | 说明 | 默认值 | 可选值 |
|---|---|---|---|---|
data |
Base64格式的Java序列化数据 | 一段已序列化好的 Java 对象(ObjectOutputStream 输出)经 Base64 编码后的文本 |
无(必填) | — |
- 无版本约束——纯 Base64 解码;可利用性取决于所嵌入序列化数据本身及目标是否存在二次反序列化点。
- 典型用途:当框架内置链无法覆盖目标环境时,用户先用其他工具(如 ysoserial)生成序列化 payload,再经本 gadget 注入到二次反序列化包装器中。
- 与 UserCustomExpr 同属「自定义原料」家族:本类产
byte[](序列化数据),后者产String(表达式)。
usedInChains 为空——自由构件,未直接出现在预设链。在预设的二次反序列化链(如 K1链二次反序列化、Rome 二次反序列化)中,它可替换掉内层「真正产出恶意对象」的那一段,改为直接投递现成序列化字节。
- 上游(
nextTags=CustomJavaDeserialize,消费本 byte[] 的二次反序列化包装器):SignedObject、RMIConnector、MapMessage、MapProxy、LazyValueWithDS/LazyValueWithDS2/LazyValueWithDS3、C3p0_C3p0HexSerialize、MchangeC3p0HexSerialize、HsqldbHexDeserJdbc、JavaBeanObjectFactoryHexDS、Axis2MetaDataEntryObf等。 - 同族/替代:UserCustomExpr(自定义表达式字符串版本)。