Java反序列化高危漏洞重现

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  ,进行反序列化​操作;
下面是成功实现打开电脑计算器的截图,你也可以试着体验一下​。

Java反序列化高危漏洞重现_第1张图片

 

你可能感兴趣的:(java,开发语言)