Java反序列化漏洞存在着极大危害,今天我来为大家重现一下:
1.新建一个 Write 类,来进行序列化操作,
package cn.serializable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Write {
public static void main(String[] args) throws IOException{
//将e转化为字节序列存储于/tmp/2.ser
Employ e = new Employ("zhangyida");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/temp/2.ser"));
oos.writeObject(e);
oos.close();
System.out.println("Serialized data is saved in /temp/2.ser");
}
}
2.新建一个 Read 类,来实现反序列化,
package cn.serializable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Read {
public static void main(String[] args) throws IOException, ClassNotFoundException{
ObjectInputStream obis = new ObjectInputStream(new jFileInputStream("/temp/2.ser"));
Employ e = (Employ) obis.readObject();
obis.close();
System.out.println(e);
}
}
3.下面就是漏洞实现的重要之处了,新建员工类 Employ.java,定义一个name 属性。
package cn.serializable;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.io.IOException;
public class Employ implements Serializable {
public String name;
public Employ() {
}
public Employ(String name){
this.name = name;
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{
ois.readObject();
Runtime.getRuntime().exec("calc");
}
}
通过观察你可以发现,在员工类 Employ.java 中,我们重写了 readObject()方法,并将可执行语句写入该方法内部,这样在进行反序列化的时候就会调用该方法,从而执行我们想要进行的操作。
4.执行步骤:
运行 Write.java ,进行序列化操作;
运行 Read.java ,进行反序列化操作;
下面是成功实现打开电脑计算器的截图,你也可以试着体验一下。