理解反序列化漏洞原理
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
反序列化漏洞一直搞不明白,所以今天特意翻出很久未动的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 秒
感谢点赞支持下哈