反序列化分析

序列化:内存信息被分成小块设置编号 ——>存到硬盘

反序列化:组装成对象恢复到内存中  <——硬盘保存Java对象的字节

条件

在Java类中,必须要实现java.io.ObjectOutputStream 和java.io.ObjectIutputStream来现实序列化反序列化的功能。一个类想要实现序列化和反序列化,必须要实现 java.io.Serializable 或java.io.Externalizable 接口

反序列化漏洞

如果被序列化的类重写了writeObjectreadObject方法,Java就会委托这两个重写的方法来进行序列化和反序列化。正是因为这个特性才导致反序列化漏洞出现:在反序列化一个类时,如果这个类重写了readObject方法,程序将会调用这个重写的方法,如果重写的readObject方法存在恶意程序,将会对应用程序造成危害。

反序列化

先对某个对象进行反序列化,看一下重写readObject()触发反序列化漏洞

 那么我们重写了readObject()就可以利用反序列化漏洞,原因是什么呢?

先看java.io.ObjectOutputStream#readObject()

readObject()方法调用readObject0()反序列化

readObject0()是以字节方式去读取

进入readOrdinaryObject()

先检查标记是否为Object   然后调用readClassDesc()获取类描述符

根据获取的内容判断类是否实现了Externalizable()接口,如果实现了该接口则调用readExternalData()       如果没有实现Externalizable(),则调用readSerialData()方法

 在readSerialData()方法中,通过类描述符获取序列化对象的数据布局

进行判断是否重写了readObject()方法,如果重写了,就是用invokReadObject()调用对象里重写的readObject()方法

如果没有就执行默认的反序列化方法

 至此,执行到invokReadObject()方法,就会调用重写的readObject()方法,如果重写的readObject()里边有危险函数那么这个危险函数就会执行。

文章如有错误或者不足之处,欢迎指正

 参考链接:java中的序列化与反序列化及其源码分析(特别详细)_qq_36744284的博客-CSDN博客

Fastjson是一个高性能的Java JSON库,可以将JSON字符串与Java对象之间进行相互转换。在反序列化方面,Fastjson提供了多种方式来实现。 首先,最常见的方式是将JSON字符串直接反序列化Java对象。你可以使用`JSON.parseObject()`方法来实现这一操作。该方法接受两个参数:要解析的JSON字符串和目标Java类的Class对象。示例代码如下: ```java String jsonString = "{\"name\":\"John\",\"age\":30}"; User user = JSON.parseObject(jsonString, User.class); ``` 在上述代码中,我们将一个包含"name"和"age"属性的JSON字符串反序列化为一个名为User的Java对象。 除了直接反序列化外,Fastjson还支持将JSON字符串反序列化为泛型类型。你可以使用`TypeReference`类来指定具体的泛型类型。示例代码如下: ```java String jsonString = "[{\"name\":\"John\",\"age\":30},{\"name\":\"Jane\",\"age\":25}]"; List<User> userList = JSON.parseObject(jsonString, new TypeReference<List<User>>() {}); ``` 在上述代码中,我们将一个包含多个User对象的JSON数组反序列化为一个List<User>对象。 此外,Fastjson还支持将JSON字符串反序列化为JSONObject对象,该对象提供了一系列操作JSON数据的方法。你可以使用`JSON.parseObject()`方法,并传入`Feature.OrderedField`参数来实现。示例代码如下: ```java String jsonString = "{\"name\":\"John\",\"age\":30}"; JSONObject jsonObject = JSON.parseObject(jsonString, Feature.OrderedField); ``` 总的来说,Fastjson提供了灵活且高效的反序列化方式,可以满足各种不同的需求。以上只是一些常用的示例,你可以根据具体情况选择适合的方法来实现反序列化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值