
Java序列化与反序列化
预备知识
序列化:Java对象 –> 字节序列
反序列化:字节序列 –> Java对象
Serializable用来标识当前类可以被ObjectOutputStream序列化,以及被ObjectInputStream反序列化
Serializable接口特点
- 序列化类的属性(自定义对象)需要实现序列化
transient/static
修饰的字段不会被序列化- static 属于类,序列化针对属性
private transient String name;
- 子类序列化,父类没有实现序列化接口需要提供无参构造器来重新创建对象
安全问题
反序列化时,客户端传来类的readObject方法肯定会执行
形式
- 入口类的readObject直接调用危险方法
- 入口类参数包含可控类,该类有危险方法,readObject时调用
- 入口类参数包含可控类,该类调用其他包含危险方法的类,readObject时调用(后面可一直套娃)
- 构造函数/静态代码块等类加载时隐式执行
自定义序列化过程
通过重写readObject/writeObject
1 | private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException |
入口类
- implements Serializable
- 重写readObject
- 调用常见函数
- 参数类型宽泛
- 最好jdk自带
调用链
相同名称,相同类型
执行类
rce ssrf 写文件
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自Assass1nの小窝
评论