JAVA反序列化与ObjectInputStream

关于ObjectOutputStream:

ObjectOutputStream:对象的序列化流,作用:把对象转成字节数据的输出到文件中保存,对象的输出过程称为序列化,可实现对象的持久存储。

关于ObjectInputStream:

ObjectInputStream 反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。

在JAVA中,利用ObjectinputStream的readObject方法进行对象读取时,如果,目标对象已经重写了readObject方法,那么此时就会执行已经被重写的readObject如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//创建一个MyObj类,此时MyObj类需要继承Serializable才能进行序列化和反序列化
public class MyObj implements Serializable{
private String name;
private void readObject(java.io.ObjectInputStream in) throws Exception, IOException {
// TODO Auto-generated method stub
in.defaultReadObject();
Runtime.getRuntime().exec("calc");//执行calc命令
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//main方法,将新的MyObj对象序列化后写入object文件,之后反序列化后再读取出来
public static void main(String[] args) throws Exception {
MyObj o=new MyObj();
o.setName("haha wocao");
FileOutputStream fos=new FileOutputStream("object");
ObjectOutputStream os=new ObjectOutputStream(fos);
os.writeObject(o);
os.close();
FileInputStream fis=new FileInputStream("object");
ObjectInputStream ois=new ObjectInputStream(fis);
MyObj o1=(MyObj) ois.readObject();
System.out.println(o1.getName());
ois.close();
}

点击运行后,发现输出了“haha wocao”并执行了calc命令

可见在反序列化时,可能会给恶意代码提供可乘之机
如果反序列化执行的是恶意构造的字节序列,那么漏洞就产生了