预备知识

序列化:Java对象 –> 字节序列
反序列化:字节序列 –> Java对象

Serializable用来标识当前类可以被ObjectOutputStream序列化,以及被ObjectInputStream反序列化

Serializable接口特点

  • 序列化类的属性(自定义对象)需要实现序列化
  • transient/static修饰的字段不会被序列化
    • static 属于类,序列化针对属性
    • private transient String name;
  • 子类序列化,父类没有实现序列化接口需要提供无参构造器来重新创建对象

安全问题

反序列化时,客户端传来类的readObject方法肯定会执行

形式

  • 入口类的readObject直接调用危险方法
  • 入口类参数包含可控类,该类有危险方法,readObject时调用
  • 入口类参数包含可控类,该类调用其他包含危险方法的类,readObject时调用(后面可一直套娃)
  • 构造函数/静态代码块等类加载时隐式执行

自定义序列化过程

通过重写readObject/writeObject

1
2
private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException
private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException

入口类

  • implements Serializable
  • 重写readObject
  • 调用常见函数
  • 参数类型宽泛
  • 最好jdk自带

调用链

相同名称,相同类型

执行类

rce ssrf 写文件