【代码审计】Java序列化和反序列化

0x00 版权声明

JAVA基础系列是笔者学习@炼石星球的笔记,大部分文字描述取自星球内发布的教程文件,仅作学习。

0x01 概念简介

01 序列化

序列化是指为了便于保存在内存、文件、数据库种把Java对象转换为字节序列的过程。ObjectOutputStream 类的 writeObject() 方法可以实现序列化

1
public final void writeObject(Object obj) throws IOException

一个类的对象需要满足两个条件才能完成序列化:

  • 该类必须实现 java.io.Serializable 接口
  • 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的

02 反序列化

反序列化是指把字节序列恢复为 Java 对象的过程。

ObjectInputStream 类的 readObject() 方法可实现反序列化。

1
public final Object readObject() throws IOException,classNotFoundException

0x02 Demo

01 序列化

首先创建一个Maven项目,默认配置,等待创建完成。

在src.main.java目录新建HackInfo.class,键入代码:

1
2
3
4
public class HackInfo implements java.io.Serializable{
public String id;
public String team;
}

在java目录新建SerializeDemo.class,键入代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeDemo {
public static void main(String [] args) throws IOException {
HackInfo hack = new HackInfo();
hack.id = "zebra";
hack.team = "Zebra Team";
//将序列化后的字节序列写到serializedata.txt文件中
FileOutputStream fileOut = new FileOutputStream("C:\\\\Users\\\\admins\\\\Desktop\\\\serializedata.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(hack);
out.close();
fileOut.close();
System.out.println("序列化的数据已经保存在了serializedata.txt文件 中");
}
}

运行SerializeDemo,在桌面会出现一个txt文件,用Winhex打开:

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com/blog/202210171415368.png

序列化的数据会有明显的特征,都是以 ac ed 00 05 73 72 开头的

02 反序列化

在java目录新建DeserializeDemo.class文件,键入代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
HackInfo hack = null;
FileInputStream fileIn = new FileInputStream("C:\\\\Users\\\\admins\\\\Desktop\\\\serializedata.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
hack = (HackInfo) in.readObject();
in.close();
fileIn.close();
System.out.println("Deserialized Employee...");
System.out.println("Name: " + hack.id);
System.out.println("Address: " + hack.team);
}
}

运行项目:

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com/blog/202210171432424.png