java反序列化与反序列化

java反序列化漏洞

JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法

java序列化过程:

调用一个函数进行序列化,存放到一个文件内,再将文件反序列化回来,涉及到文件的读写

序列化与反序列化

序列化:
ObjectOutputStream --> writeObject ()

反序列化:
ObjectInputStream--> readObject()

java内进行序列化反序列化,需要先和序列化反序列化存在继承关系才可以使用方法

涉及到方法的重写,子类继承父类的方法,子类需要方法更加精细,需要扩展一些功能,重写这个方法使其更加适合自己,当重写父类某个方法后,调用子类的方法

假设开发者在java反序列化的代码内加入了一行调用计算器的代码,代指那些被重写以后的反序列化方法里存在的危险代码

image

Person

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Person implements Serializable {
public int age;
public String name;

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        Runtime.getRuntime().exec("calc");
        // 默认的反序列化操作
        in.defaultReadObject();
    }
}

test

import java.io.*;

public class Test {	
    public static void main(String[] args) throws IOException, ClassNotFoundException {
    Person p=new Person();//获取一个Person对象,赋两个值给person对象
    p.age=18;
    p.name="xiu";
		//调用serialize函数,对象p为刚创建的Person对象,路径没有绝对路径,没有相应的文件,会在当前路径创建一个文件,把对象序列化存入
        serialize(p,"xiu.bin");

		//输出
        System.out.println("反序列化结果:" + deserialize("xiu.bin"));
    }
		//serialize接收两个参数,一个对象,一个文件路径,把序列化后的obj对象,存储到filePath指定的文件路径里
    public static void serialize(Object obj, String filePath) throws IOException {
        try (FileOutputStream fileOut = new FileOutputStream(filePath);
             ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
            objectOut.writeObject(obj);
        }
    }
  //给deserialize一个文件路径,该函数会把这个文件内的内容反序列化回对象
     public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
        try (FileInputStream fileIn = new FileInputStream(filePath);
             ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
            return objectIn.readObject();
        }
    }
}

先把Person内的重写反序列化注释掉,使用系统的原生反序列化操作

image

执行后的结果如下,创建了一个xiu.bin文件,输出了反序列化的结果

image

查看xiu.bin里序列化的内容

image

取消掉注释后执行Test文件计算器调用,意味着危险代码被执行

image

重写了某个readObject方法,实现链式调用,导致java的反序列化

posted @ 2023-06-27 22:58  i苏沐辰  阅读(52)  评论(0编辑  收藏  举报