Fastjson反序列化漏洞系列1-什么是fastjson反序列化?
字数 1682 2025-08-18 11:39:00
Fastjson反序列化漏洞深度解析
1. Fastjson简介
Fastjson是阿里巴巴开发的高性能JSON处理库,具有以下特点:
- 采用"假定有序快速匹配"算法,性能优异
- 提供JSON字符串与Java对象之间的双向转换
- 主要接口:
toJSONString:序列化(Java对象→JSON字符串)parseObject:反序列化(JSON字符串→Java对象)
2. Fastjson反序列化框架
Fastjson的反序列化框架核心组件:
- JSON门面类:提供静态方法如
parse、parseObject - DefaultJSONParser:实现主要解析功能
- ParserConfig:保存相关配置信息
- JSONLexerBase:处理字符分析
- JavaBeanDeserializer:负责反序列化操作
3. Fastjson基本使用示例
3.1 定义Java Bean
public class User {
private Long id;
private String name;
// Getter和Setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
3.2 序列化与反序列化示例
import com.alibaba.fastjson.JSON;
public class Test {
public static void main(String[] args) {
// 序列化示例
User guestUser = new User();
guestUser.setId(1L);
guestUser.setName("guest");
String jsonString1 = JSON.toJSONString(guestUser);
System.out.println("Json对象:" + jsonString1);
// 反序列化示例
String jsonString2 = "{\"id\":2,\"name\":\"root\"}";
User user = JSON.parseObject(jsonString2, User.class);
System.out.println("Java对象:" + user);
System.out.println(user.getClass().getTypeParameters());
}
}
输出结果:
Json对象:{"id":1,"name":"guest"}
Java对象:User@7ab2bfe1
[Ljava.lang.reflect.TypeVariable;@497470ed
4. Fastjson反序列化漏洞原理
4.1 漏洞成因
Fastjson反序列化漏洞的核心问题在于:
- @type属性:可以指定反序列化任意类
- 方法调用:会自动调用目标类的setter/getter/is方法
- 属性设置:通过反序列化可以自由设置类的属性值
4.2 攻击流程
典型的Fastjson反序列化RCE攻击流程:
- 攻击者准备RMI服务和Web服务
- 将RMI绝对路径注入到lookup方法中
- 受害者JNDI接口指向攻击者控制的RMI服务器
- JNDI接口向攻击者控制的Web服务器远程加载恶意代码
- 执行构造函数形成RCE(远程代码执行)
4.3 必要条件
要成功利用Fastjson反序列化漏洞需要满足以下条件:
- 目标类需要有无参默认构造方法,或者通过注解指定构造方法
- 需要使用
Feature.SupportNonPublicField才能反序列化非公有属性
5. Fastjson反序列化调用链分析
5.1 序列化过程调用链
com.alibaba.fastjson.JSON.class的toJSONString方法com.alibaba.fastjson.serializer.SerializeWriter.class的SerializeWriter对象- 读取
SerializeConfig配置 - 最终由
com.alibaba.fastjson.serializer.JavaBeanSerializer.class执行序列化
5.2 反序列化过程调用链
com.alibaba.fastjson.JSON.class的parseObject方法com.alibaba.fastjson.parser.DefaultJSONParser.class的parseObject方法com.alibaba.fastjson.parser.ParserConfig.class的ObjectDeserializer对象- 最终由
com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.class执行反序列化
6. 历史漏洞版本
文中提到的Fastjson反序列化RCE漏洞版本:
- CNVD-2017-02833:fastjson <=1.2.24
- CNVD-2019-22238:fastjson <1.2.48
- CNVD-2019-32498:fastjson <=1.2.60
7. 防御建议
针对Fastjson反序列化漏洞的防护措施:
- 及时升级到最新安全版本
- 使用安全模式(
SafeMode)限制反序列化类 - 避免反序列化不可信的JSON数据
- 关闭不必要的特性(如
AutoType)
8. 参考资源
注:本文为Fastjson反序列化漏洞系列的第一部分,后续将深入探讨如何构造POC以及各版本漏洞的具体分析。