JAVA序列化与反序列化(从开发的角度详细讲解)

目录

一.简介

二.序列化和反序列化的流程

三.反序列化利用链


一.简介

序列化:对象转换成字节流

反序列化:字节流转换成对象

使用语言:这样长的代码要发送有很多空格,缩进的东西,ctrl+V发送不好用,无法模拟这些东西,所以用序列化技术,把代码段封装起来,封装字节流,封装的过程叫做序列化,存储在文件中,通过反序列化操作还原文件中的内容

序列化反序列化协议:JAVA内置的writeObject()/readObject()

二.序列化和反序列化的流程

obj在序列化的时候会把他写入到ser.txt里面去,这里对UserDemo进行序列化操作

ser.txt就是对象u序列化后的字符流数据

把ser.txt反序列化,内容还原,读取filename,将他readObject()还原内容

三.反序列化利用链

(1) 被序列化类的readObject直接调用危险方法

要序列化UserDemo,他里面有readObject函数,先调用正确的readObject再命令执行,调用计算器

序列化的时候序列化UserDemo

反序列化的时候弹出计算器,执行readObject的时候,调用了重写的序列化中的readObject,即UserDemo里面的readObject方法,而不是本身自带的方法


 

(2) 反序列化后输出对象,导致构造函数/静态代码块等类加载隐式执行,如ToString()

函数中写入调用计算器的功能

先序列化,然后反序列化,反序列化的对象是obj,然后输出他

弹出计算器

因为对obj对象进行输出默认调用原始对象的toString方法

(3) 入口参数中包含可控类,该类有危险方法,readObject时调用

HashMap专门做浏览器访问和DNS解析的事情的

序列化对象hash来源于自带类HashMap

*Gadget Chain:
HashMap.read0bject()调用自带的readObject()
HashMap.putVal()
HashMap. hash()
URL.hashCode()DNS的访问

调试:

跟进:

跟进:

跟进:

hashCode 执行结果触发访问DNS请求如果这里是执行命令的话就是RCE漏洞


在ObjectOutputStream中进行序列化操作的时候,会判断被序列化的对象是否自己重写了writeObject方法,如果重写了,就会调用被序列化对象自己的writeObject方法,如果没有重写,才会调用默认的序列化方法。read0bject本来在ObjectInputSteam这里,HashMap也有readObject方法,反序列化readObject方法调用HashMap里面的read0bject。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值