目录
一.简介
序列化:对象转换成字节流
反序列化:字节流转换成对象
使用语言:这样长的代码要发送有很多空格,缩进的东西,ctrl+V发送不好用,无法模拟这些东西,所以用序列化技术,把代码段封装起来,封装字节流,封装的过程叫做序列化,存储在文件中,通过反序列化操作还原文件中的内容
序列化反序列化协议:JAVA内置的writeObject()/readObject()
二.序列化和反序列化的流程
obj在序列化的时候会把他写入到ser.txt里面去,这里对UserDemo进行序列化操作
ser.txt就是对象u序列化后的字符流数据
把ser.txt反序列化,内容还原,读取filename,将他readObject()还原内容
![](https://i-blog.csdnimg.cn/blog_migrate/399dc34b4da7f5e6cb6293c03d09f1cd.png)
三.反序列化利用链
(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。