扫一扫关注公众号,长期致力于安全研究
前言:在分析其漏洞之前,应先对该应用有个基本的了解和使用。本文是笔者之前从网上搜到的资料..来自于Y4师傅
Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两个主要接口JSON.toJSONString和JSON.parseObject/JSON.parse来分别实现序列化和反序列化操作。
项目地址:https://github.com/alibaba/fastjson
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.23</version></dependency>
JSON:门面类,提供入口
DefaultJSONParser:主类
ParserConfig:配置相关类
JSONLexerBase:字符分析类
JavaBeanDeserializer:JavaBean反序列化类
JSON.toJSONString()中的一个设置属性值,设置之后在序列化的时候会多写入一个@type,即写上被序列化的类名,type可以指定反序列化的类,并且调用其getter/setter/is方法
如果需要还原出private属性的话,还需要在JSON.parseObject/JSON.parse中加上Feature.SupportNonPublicField参数
下面是一个基本demo
import com.alibaba.fastjson.*;import com.alibaba.fastjson.serializer.SerializerFeature;public class Student {private String name;private int age;public Student() {System.out.println("Student构造函数");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public static void main(String[] args) {Student student = new Student();student.setName("name");student.setAge(23333);System.out.println(JSON.toJSONString(student, SerializerFeature.WriteClassName));}}
一般没人会给私有属性加setter方法,加了就没必要声明为private
package fastj;import com.alibaba.fastjson.*;import com.alibaba.fastjson.parser.Feature;import com.alibaba.fastjson.serializer.SerializerFeature;public class Student {private String name;private int age;public Student() {System.out.println("Student构造函数");}public String getName() {return name;}public int getAge() {return age;}public static void main(String[] args) {Student obj = JSON.parseObject("{\"@type\":\"fastj.Student\",\"age\":23333,\"name\":\"yyds\"}", Student.class, Feature.SupportNonPublicField);System.out.println(obj);System.out.println(obj.getClass().getName());System.out.println(obj.getName() + " " + obj.getAge());}}
当反序列化为JSON.parseObject(*)形式即未指定class时,会调用反序列化得到的类的构造函数、所有属性的getter方法、JSON里面的非私有属性的setter方法,其中properties属性的getter方法会被调用两次;
当反序列化为JSON.parseObject(*,*.class)形式即指定class时,只调用反序列化得到的类的构造函数、JSON里面的非私有属性的setter方法、properties属性的getter方法;
当反序列化为JSON.parseObject(*)形式即未指定class进行反序列化时得到的都是JSONObject类对象,而只要指定了class即JSON.parseObject(*,*.class)形式得到的都是特定的Student类;
parse他会去优先去匹配调用字段的set方法,如果没有set方法,就会去寻找字段的get方法(有条返回值要是Collection|Map|AtomicBoolean|AtomicInteger|AtomicLong,这就是TemplatesImpl调用链的触发原因)
parseObject会调用set与get方法
下方扫一下扫,即可关注