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方法
  • 可通过两种方式获取实际对象:
    1. 传入第二个参数指定类:parseObject(jsonStr, TargetClass.class)
    2. 对返回的JSONObject调用toJavaObject()

0x04 反序列化流程分析

核心调用链

  1. parseObject(String)parse(String)
  2. parse(String text, int features)
  3. 实例化DefaultJSONParser →
  4. 调用无参parse()
  5. 进入parse(Object)处理令牌

关键处理步骤

  1. 遇到{时创建JSON对象
  2. 解析@type字段获取目标类名
  3. 加载指定类并获取反序列化器
  4. 创建JavaBean反序列化器(涉及ASM优化)

JavaBean反序列化器创建

  1. 检查类是否在黑名单中

  2. 创建JavaBeanInfo,收集类信息:

    • 遍历所有方法,识别setter方法:
      • 方法名长度>4
      • 非静态
      • 返回void
      • 以"set"开头
      • 接受一个参数
    • 收集字段信息
    • 识别getter方法:
      • 方法名长度>4
      • 非静态
      • 以"get"开头
      • 返回Collection/Map/Atomic*类型
      • 无参数
      • 无对应setter方法
  3. 根据ASM开关决定使用ASM优化或常规反序列化器

反序列化执行

  1. 构造目标类实例
  2. 根据FieldList进行属性赋值:
    • 调用对应setter方法
    • 对于只有getter的属性也会处理
  3. 对于parseObject,后续会调用toJSON()触发getter方法

0x05 漏洞原理

根本原因

  1. @type特性允许指定任意类进行反序列化
  2. 自动调用setter/getter方法机制
  3. 攻击者可构造恶意JSON,指定危险类并触发其方法

关键利用点

  1. 类中存在的setter/getter方法可作为入口点
  2. 即使JSON中的字段名与类字段不匹配,只要匹配方法名也能触发
  3. 通过方法链最终执行危险操作(如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 防御措施

  1. 升级到最新安全版本
  2. 关闭autoType功能
  3. 使用白名单机制限制反序列化的类
  4. 对输入进行严格过滤

0x07 总结

Fastjson反序列化漏洞的核心在于:

  1. 通过@type指定任意类
  2. 自动调用setter/getter的机制
  3. 攻击者可构造链式调用达到恶意目的

理解这些机制对于防御Fastjson反序列化攻击至关重要。

Fastjson反序列化漏洞原理深度解析 0x01 前言 Fastjson是Java中广泛使用的JSON处理库,但其反序列化机制存在严重安全漏洞。本文将全面剖析Fastjson反序列化漏洞的原理、机制和利用方式。 0x02 前置知识 JSON基础 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,示例: Fastjson简介 Fastjson是阿里巴巴开源的高性能JSON处理库,主要功能: 序列化: JSON.toJSONString(Object object) 反序列化: JSON.parse() 和 JSON.parseObject() 关键安全特性 Fastjson引入了 @type 字段,允许指定反序列化的目标类: 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方法 根据ASM开关决定使用ASM优化或常规反序列化器 反序列化执行 构造目标类实例 根据FieldList进行属性赋值: 调用对应setter方法 对于只有getter的属性也会处理 对于parseObject,后续会调用toJSON()触发getter方法 0x05 漏洞原理 根本原因 @type 特性允许指定任意类进行反序列化 自动调用setter/getter方法机制 攻击者可构造恶意JSON,指定危险类并触发其方法 关键利用点 类中存在的setter/getter方法可作为入口点 即使JSON中的字段名与类字段不匹配,只要匹配方法名也能触发 通过方法链最终执行危险操作(如RCE) 漏洞利用示例 恶意类示例: 恶意JSON: 0x06 防御措施 升级到最新安全版本 关闭 autoType 功能 使用白名单机制限制反序列化的类 对输入进行严格过滤 0x07 总结 Fastjson反序列化漏洞的核心在于: 通过 @type 指定任意类 自动调用setter/getter的机制 攻击者可构造链式调用达到恶意目的 理解这些机制对于防御Fastjson反序列化攻击至关重要。