理解反序列化漏洞原理

共 3154字,需浏览 7分钟

 ·

2021-03-26 08:38

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达


反序列化漏洞一直搞不明白,所以今天特意翻出很久未动的java,学习了一下序列化。


简单来说,序列化可以理解为就是将对象转化为字节流,字节流中包括这个对象的数据和信息,序列化和反序列化便于类的持久保存,并且很利于网络传输。在面向对象的编程中,都会涉及到序列化和反序列化,像java中,有一个接口Serializable,用来实现java序列化,php中也有Serializable方法来实现php序列化。这里我写了一个java的序列化。


下面是一个student类,为实现序列化,需要继承Serializable接口

import java.io.Serializable;

public class student implements Serializable {
    private String name;
    private String age;

    public void setAge(String age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

}



然后我在main函数中实现序列化。通过流,将一个名为s的student类 序列化,并将其存到Student.ser文件中

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class run {
    public static void main(String[] args) {
        student s = new student();
        s.setAge("21");
        s.setName("Hileaf");
        try {
            FileOutputStream fileOut = new FileOutputStream("Student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(s);
            out.close();
            fileOut.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



运行后,序列化过的s如下:

我们不用关心乱码。我们这里把字节流存入到ser文件中,并且,这条字节流也可以保存在内存、数据库中。

而反序列化,就是通过这条字节流的数据和信息,将它还原成一个类。这里我们字节流没有任何过滤,也就是说,我们在new一个新的类时,内容是用户可控的,即字节流就是用户可控的。

那么这样,就容易理解反序列化漏洞了。


如果Java应用对用户输入(即不可信数据)做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的类或对象,这个类或对象在产生过程中就有可能带来任意代码执行。

所以这个问题的根源在于,字节流进行还原时,即用到ObjectInputStream在反序列化时,没有对生成的对象的类型做限制。这就是java反序列化漏洞的原理,php和Python也基本相同。

————————————————

版权声明:本文为CSDN博主「Hileaf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_50620293/article/details/114982372





粉丝福利:Java从入门到入土学习路线图

👇👇👇

👆长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报