目录
5、重写readObject方法调用计算器,实现反序列化漏洞的原理
1、PHP反序列化漏洞的成因
序列化与反序列化是为了数据在网上传递的完整性,但是被攻击者找到了漏洞,接下来介绍漏洞。
反序列化的时候会调用方法,魔术方法(魔术方法是php语言里代码执行自动调用的方法,例如construct()、destruct()),预先在类里定义好的魔术方法会自动调用,这些被调用的魔术方法会调用别的方法(危险方法,例如system)最终实现链式调用 。
2、java类继承
public为Java里的关键字,public定义为公开,person为一个类,类里面可以有变量、函数等等。在类里被关键字static修饰的函数不能被继承,这是static关键字的作用。
stu为继承person的子类,继承需要使用关键字extends,继承后stu类可以使用父类里定义的变量、函数(除被static关键字修饰的变量、函数)
在main函数中定义变量
3、java方法的重写
重写:父类本身有speak()方法,子类可以自己写一个具有子类特点的speak()方法:
父类person代码不变,子类stu代码如下。重写是为了实现子类的独特性,子类不可能与父类有完全相同的特性。
main函数代码也不变
输出stu speak具有stu类的特点,重写成功。
4、编写JAVA反序列化的代码实现序列化与反序列化
序列化:ObjectOutputStream 类--> writeObject()函数
反序列化:ObjectInputStream类 --> readObject()函数
implement在java中为接口,throws为java中抛出异常
序列化代码:使用writeObject()函数
public static void serialize(Object obj, String filePath) throws IOException {
try (FileOutputStream fileOut = new FileOutputStream(filePath);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
objectOut.writeObject(obj);
}
}
反序列化代码,使用 readObject()函数
public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
try (FileInputStream fileIn = new FileInputStream(filePath);
ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
return objectIn.readObject();
}
}
Usr类中定义了两个变量name、age
可以在文件夹中发现多了一个alice文件,查看内容为序列化后的格式
5、重写readObject方法调用计算器,实现反序列化漏洞的原理
在Usr类里 重写后,再次执行Test类可以实现调用计算器
6、尝试使用代码解释什么是序列化漏洞
PHP的反序列化和java的反序列化是两种不同的类型,序列化只为实现数据的完整高效的传输
PHP反序列漏洞是由于类里面的魔术方法调用了某个函数,该魔术函数又调用了别的函数,最终执行了危险函数;JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行了危险方法
php反序列化:
php类的概念
类是一种类型,可以定义具体对象在类中并实现类的属性。
php有四种魔术方法:
sleep函数,需要序列化serialize()
wakeup函数需要反序列化unserialize,反序列化又需要序列化,反序列化是针对序列化后的变量
construct函数创建对象,需要调用函数达到输出效果
destruct函数需要创建对象才能销毁对象,其中unset()用来销毁变量并释放内存空间
php序列化可以确保数据完整的传输,自定义魔术函数在序列化后可自动调用,通过在魔术函数中调用其它函数,实现链式调用函数形成反序列化漏洞。
java反序列化即为4、5结合,重写了readobject()方法,调用了Runtime.getRuntime().exec("calc");执行了打开计算机操作。