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的反序列化框架核心组件:

  1. JSON门面类:提供静态方法如parseparseObject
  2. DefaultJSONParser:实现主要解析功能
  3. ParserConfig:保存相关配置信息
  4. JSONLexerBase:处理字符分析
  5. 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反序列化漏洞的核心问题在于:

  1. @type属性:可以指定反序列化任意类
  2. 方法调用:会自动调用目标类的setter/getter/is方法
  3. 属性设置:通过反序列化可以自由设置类的属性值

4.2 攻击流程

典型的Fastjson反序列化RCE攻击流程:

  1. 攻击者准备RMI服务和Web服务
  2. 将RMI绝对路径注入到lookup方法中
  3. 受害者JNDI接口指向攻击者控制的RMI服务器
  4. JNDI接口向攻击者控制的Web服务器远程加载恶意代码
  5. 执行构造函数形成RCE(远程代码执行)

4.3 必要条件

要成功利用Fastjson反序列化漏洞需要满足以下条件:

  1. 目标类需要有无参默认构造方法,或者通过注解指定构造方法
  2. 需要使用Feature.SupportNonPublicField才能反序列化非公有属性

5. Fastjson反序列化调用链分析

5.1 序列化过程调用链

  1. com.alibaba.fastjson.JSON.classtoJSONString方法
  2. com.alibaba.fastjson.serializer.SerializeWriter.classSerializeWriter对象
  3. 读取SerializeConfig配置
  4. 最终由com.alibaba.fastjson.serializer.JavaBeanSerializer.class执行序列化

5.2 反序列化过程调用链

  1. com.alibaba.fastjson.JSON.classparseObject方法
  2. com.alibaba.fastjson.parser.DefaultJSONParser.classparseObject方法
  3. com.alibaba.fastjson.parser.ParserConfig.classObjectDeserializer对象
  4. 最终由com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.class执行反序列化

6. 历史漏洞版本

文中提到的Fastjson反序列化RCE漏洞版本:

  1. CNVD-2017-02833:fastjson <=1.2.24
  2. CNVD-2019-22238:fastjson <1.2.48
  3. CNVD-2019-32498:fastjson <=1.2.60

7. 防御建议

针对Fastjson反序列化漏洞的防护措施:

  1. 及时升级到最新安全版本
  2. 使用安全模式(SafeMode)限制反序列化类
  3. 避免反序列化不可信的JSON数据
  4. 关闭不必要的特性(如AutoType

8. 参考资源

  1. 示例代码GitHub仓库
  2. Fastjson官方GitHub

注:本文为Fastjson反序列化漏洞系列的第一部分,后续将深入探讨如何构造POC以及各版本漏洞的具体分析。

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 3.2 序列化与反序列化示例 输出结果: 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. 参考资源 示例代码GitHub仓库 Fastjson官方GitHub 注:本文为Fastjson反序列化漏洞系列的第一部分,后续将深入探讨如何构造POC以及各版本漏洞的具体分析。