【Web】关于FastJson反序列化开始前的那些前置知识

目录

FastJson介绍

FJ序列化与反序列化方法

关于反序列化三种方式的关系与区别

FastJson反序列化漏洞原理通识

关于getter&setter


FastJson介绍

FastJson(快速JSON)是一个Java语言编写的高性能、功能丰富且易于使用的JSON解析和序列化库。它由阿里巴巴集团开发,提供了一种快速、高效的方式来处理JSON数据。

FJ序列化与反序列化方法

序列化:JSON.toJSONString()
++参数设置++:SerializerFeature.WriteClassName 序列化时,会多出一个@type跟上类名

反序列化:JSON.parseObject()
++参数设置++:Feature.SupportNonPublicField 反序列化时,加上该参数才能还原private属性

关于反序列化三种方式的关系与区别

fastjson 处理反序列化的方式主要有三种

1、Object obj = JSON.parse(jsonstr);

2、Object obj = JSON.parseObject(jsonstr, UserFastJson.class);

3、Object obj = JSON.parseObject(jsonstr);

①JSON.parseObject(jsonstr) 和 JSON.parseObject(jsonstr,UserFastJson.class)输出的结果一致,都是执行了**++构建器以及setter方法++** 。JSON.parseObject(jsonstr) 处理方式,不仅仅执行了**++构建器++** ,还执行了所有的**++setter、getter方法++**。

②JSON.parse(jsonstr)与JSON.parseObject(jsonstr, UserFastJson.class)可以认为是完全一样的,最后得到的是**++具体类对象++** ,而parseObject(String text)是在二者的基础上又执行了一次JSON.toJSON(),其先遍历所有的setter方法,然后再遍历getter方法,最后得到的是**++JSONObject类对象++**

也就是说JSON.parseObject()本质上还是调用JSON.parse()进行反序列化的,区别是parseObject()会额外调用JSON.toJSON()来将Java对象转为JSONObject对象。

③fastjson支持使用@type指定反序列化的目标类

JSON.parse(jsonString) 和 JSON.parseObject(jsonString, Target.class),前者会在 jsonString 中解析字符串获取 @type 指定的类,后者则会直接使用参数中的class。

FastJson反序列化漏洞原理通识

若能找到一个类、在反序列化这个类对象时,fastjson调用其setter或getter方法,且setter或getter方法存在漏洞,可以执行恶意代码。

这也是FJ反序列化漏洞与基于readObject的其他反序列化漏洞的最大区别。

此外,fastjson 在反序列化时,如果 Field 类型为 byte[],将会调用com.alibaba.fastjson.parser.JSONScanner#bytesValue 进行 base64 解码,对应的,在序列化时也会进行 base64 编码。

关于getter&setter

fastjson 在为类属性寻找 getter&setter 方法时,调用函数 com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer#smartMatch() 方法,会忽略 _|- 字符串

满足条件的setter方法:

函数名大于等于4,非静态函数,以set开头且第4个字母为大写,返回类型为void或当前类,参数个数为1个

满足条件的getter方法:

函数名长度大于等于4,非静态方法,以get开头且第4个字母为大写,无参数,返回值类型继承自Collection或Map或AtomicBoolean或AtomicInteger

相关推荐
kali-Myon2 小时前
NewStarCTF2025-Week1-Misc
安全·ctf·misc
Han.miracle2 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu3 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白4 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
360智汇云4 小时前
Golang Context 的巧妙应用:提高并发管理的艺术
web
无妄无望4 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科5 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20165 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋6 小时前
【word多文档docx合并】
java·word
@yanyu6666 小时前
idea中配置tomcat
java·mysql·tomcat