理解反序列化漏洞原理

反序列化漏洞一直搞不明白,所以今天特意翻出很久未动的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也基本相同。

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值