一文看懂Java反序列化

什么是序列化?反序列化?

  1. 简单了解什么叫序列化&反序列化
    序列化:把Java对象转换为字节序列的过程。
    反序列化:把字节序列恢复为Java对象的过程。
  2. 为什么要序列化再反序列化呢?
    一句话解释:为了数据传输呗【将对象转成二进制的字节序列才能在网络上传】

JAVA怎么做到序列化和反序列化的?

主流的方式就是利用函数接口。
在这里插入图片描述看一个具体的例子

    private static void serialPerson() throws IOException {
        Person person = new Person("Zhangsan", 100, "妖", 101);

        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(new File("d:/person.txt"))
        );
        oos.writeObject(person);
        System.out.println("person 对象序列化成功!");
        oos.close();
    }

我们把 Person 类,保存到person.txt记事本中,通过 FileOutputStream 方法进行保存。这里就默认进行了序列化操作。
我们用 winhex 来查看一下person.txt
在这里插入图片描述后序,当接受到此序列化字符时,再调用FileInputStream 方法读数据,并且进行反序列化就能够正确识别文本信息了

    private static Person deserialPerson() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(new File("d:/person.txt"))
        );
        Person person = (Person)ois.readObject();
        System.out.println("person 对象反序列化成功!");
        //Runtime.getRuntime().exec("calc.exe");
        return person;
    }

小结

其实就很像一个编码,解码的过程。可以类比 ,url编码,url解码。

JAVA识别序列化

我们需要在看到一些字符串的时候,至少能够识别这是序列化的数据。
在这里插入图片描述在这里插入图片描述

反序列化存在的安全问题

那么问题来了,这么好的一个功能为什么就会存在安全问题呢?
思路很简单,如果上述的person.txt文本,人为可控,那么就可以做到RCE了

Webgoat 靶场案例

webgoat 第八关,不安全的反序列化
在这里插入图片描述这里submit就是提交序列化脚本,然后靶场会对序列化脚本进行反序列化。
这里我们尝试进行一次RCE
Step1:通过白盒审计,知道webgoat 第八关的构建时。引入了 Hibernate1依赖

Step2:利用工具 ysoserial 1生成一个打开计算器的payload。

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "calc.exe" > x.bin

Step3:payload进行base64编码

Step4:Exploit:复制编码后的数据,输入submit。
在这里插入图片描述


  1. https://github.com/angelwhu/ysoserial ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值