fastjson反序列化
fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库,用于将数据在 Json 和 Java Object之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。提供两个主要接口:JSON.toJSONString 和 JSON.parseObject/JSON.parse 分别实现序列化和反序列。
1
|
Fastjson 反序列化漏洞的核心原理可以用一句话概括:利用 Fastjson 的 AutoType 特性(@type),在解析 JSON 字符串时,让服务端实例化攻击者指定的危险类,并利用 Fastjson 自动调用 Setter/Getter 方法的特性,触发该类中的恶意逻辑。
|
接下来写个序列化和反序列化的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package org.example;
import com.alibaba.fastjson.JSON;
class Person {
//使用Alt+Insert键可以快速生成属性的getter和setter方法
public String name;
public int age;
public String getName() {
System.out.println("执行了getName方法");
return name;
}
public void setName(String name) {
System.out.println("执行了setName方法");
this.name = name;
}
public int getAge() {
System.out.println("执行了getAge方法");
return age;
}
public void setAge(int age) {
System.out.println("执行了setAge方法");
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.setName("John");
p.setAge(22);
//序列化
System.out.println("----------序列化操作----------");
String json = JSON.toJSONString(p);
System.out.println(json);
//反序列化
System.out.println("----------反序列化操作----------");
Person unserjson = JSON.parseObject(json, Person.class);
System.out.println(unserjson);
}
}
|

序列化的时候,JSON#toJSONString方法会调用原生类的getter方法。反序列化的时候,JSON#parseObject()方法会再一次调用原生类的Setter方法。