Java反序列化漏洞学习初探
面向对象思想
序列化与反序列化是基于面向对象而言的,所以首先要理解什么是面向对象的思想。
万物皆对象,我们在描述事物时,可以抽取其中我们需要的特征与行为,忽略我们所不需要的,将其抽象为一个所谓“类”的东西,特征即为成员变量,行为即为成员函数。类的实例叫做对象。
序列化与反序列化介绍
为了方便实现类的保存与恢复,出现了序列化与反序列化机制
- 序列化:将对象转换为文件或字符串存储的过程
- 反序列化:将文件或字符串恢复为对象的过程
反序列化漏洞出现的原因
Java的序列化通过writeObject实现,反序列化通过readObject来实现,若是开发过程中readObject重写不当,就有可能出现反序列化漏洞
实例
定义漏洞User类
首先定义一个User类
1 | class User implements Serializable { |
序列化
实例化User类并进行序列化,生成yd0ng.ser文件
1 | import java.io.*; |
运行代码,成功生成yd0ng.ser文件
查看该文件,发现存储的是序列化后的文件
- aced 0005 73是序列化文件头,
- 72 0004 5573 6572 f631 8ae6 6af0 dc50 0200 02是类的描述
- 49000361 67654C00 046E616D 65740012 4C6A6176 612F6C61 6E672F53 7472696E 673B7870 00000015 74000579 64306E67是对象中成员变量的描述
反序列化
反序列化代码
1 | import java.io.*; |
运行代码,会执行我们重写的readObject,创建hacked文件
后记
只是用了一个简单的反序列化的demo来演示了一下反序列化的触发过程,其实与其他语言的反序列化应该是大同小异的,真正出现在应用场景中的反序列化也肯定要比这个复杂n倍,有空可以拜读一下佬们的反序列化漏洞调试文章,Java这个语言有点奇怪,不做异常处理还不能运行QAQ。刚开始学Java安全,哪里写的不太对,哥哥姐姐弟弟妹妹们记得直接指出,万分感谢。
本文链接: https://yd0ng.github.io/2020/08/06/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%9D%E6%8E%A2/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!