序列化与反序列化

目录

1、PHP反序列化漏洞的成因

2、java类继承

3、java方法的重写

4、编写JAVA反序列化的代码实现序列化与反序列化

5、重写readObject方法调用计算器,实现反序列化漏洞的原理

6、尝试使用代码解释什么是序列化漏洞

php反序列化:

php类的概念

php四种魔术方法:



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");执行了打开计算机操作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值