Fastjson反序列化漏洞原理分析
字数 1470 2025-08-20 18:18:11
Fastjson反序列化漏洞原理深度解析
0x01 前言
Fastjson是Java中广泛使用的JSON处理库,但其反序列化机制存在严重安全漏洞。本文将全面剖析Fastjson反序列化漏洞的原理、机制和利用方式。
0x02 前置知识
JSON基础
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,示例:
{
"name": "BossFrank",
"age": 23
}
Fastjson简介
Fastjson是阿里巴巴开源的高性能JSON处理库,主要功能:
- 序列化:
JSON.toJSONString(Object object) - 反序列化:
JSON.parse()和JSON.parseObject()
关键安全特性
Fastjson引入了@type字段,允许指定反序列化的目标类:
{
"@type": "com.example.Person",
"name": "Mike",
"age": 17
}
0x03 反序列化函数差异
JSON.parse()
- 返回指定
@type的实际Java对象 - 仅调用目标类的setter方法
JSON.parseObject()
- 返回JSONObject对象
- 调用目标类的getter和setter方法
- 可通过两种方式获取实际对象:
- 传入第二个参数指定类:
parseObject(jsonStr, TargetClass.class) - 对返回的JSONObject调用
toJavaObject()
- 传入第二个参数指定类:
0x04 反序列化流程分析
核心调用链
parseObject(String)或parse(String)→parse(String text, int features)→- 实例化DefaultJSONParser →
- 调用无参
parse()→ - 进入
parse(Object)处理令牌
关键处理步骤
- 遇到
{时创建JSON对象 - 解析
@type字段获取目标类名 - 加载指定类并获取反序列化器
- 创建JavaBean反序列化器(涉及ASM优化)
JavaBean反序列化器创建
-
检查类是否在黑名单中
-
创建JavaBeanInfo,收集类信息:
- 遍历所有方法,识别setter方法:
- 方法名长度>4
- 非静态
- 返回void
- 以"set"开头
- 接受一个参数
- 收集字段信息
- 识别getter方法:
- 方法名长度>4
- 非静态
- 以"get"开头
- 返回Collection/Map/Atomic*类型
- 无参数
- 无对应setter方法
- 遍历所有方法,识别setter方法:
-
根据ASM开关决定使用ASM优化或常规反序列化器
反序列化执行
- 构造目标类实例
- 根据FieldList进行属性赋值:
- 调用对应setter方法
- 对于只有getter的属性也会处理
- 对于parseObject,后续会调用toJSON()触发getter方法
0x05 漏洞原理
根本原因
@type特性允许指定任意类进行反序列化- 自动调用setter/getter方法机制
- 攻击者可构造恶意JSON,指定危险类并触发其方法
关键利用点
- 类中存在的setter/getter方法可作为入口点
- 即使JSON中的字段名与类字段不匹配,只要匹配方法名也能触发
- 通过方法链最终执行危险操作(如RCE)
漏洞利用示例
恶意类示例:
public class EvilClass {
private String cmd;
public void setCmd(String cmd) {
this.cmd = cmd;
Runtime.getRuntime().exec(cmd); // 危险操作
}
}
恶意JSON:
{
"@type": "com.example.EvilClass",
"cmd": "calc.exe"
}
0x06 防御措施
- 升级到最新安全版本
- 关闭
autoType功能 - 使用白名单机制限制反序列化的类
- 对输入进行严格过滤
0x07 总结
Fastjson反序列化漏洞的核心在于:
- 通过
@type指定任意类 - 自动调用setter/getter的机制
- 攻击者可构造链式调用达到恶意目的
理解这些机制对于防御Fastjson反序列化攻击至关重要。