json组件下的原生反序列化getter触发
字数 1544 2025-08-22 12:23:42

Fastjson原生反序列化getter触发机制分析

前言

本文详细分析fastjson在解析JSON过程中如何触发getter方法,以及如何利用这一特性构建反序列化利用链。fastjson不仅能够作为反序列化Gadgets中的重要环节,还能通过特定方式直接触发目标对象的getter方法。

基本概念

fastjson中的可序列化类

在fastjson中,实现了Serializable接口的类很少,主要包括以下三类:

  1. AntiCollisionHashMap:实现了自己的readObject方法
  2. JSONObject/JSONArray:这些类有自己的readObject方法,主要通过重写ObjectInputStream#resolveClass方法进行反序列化类的安全性检查
  3. 其他类:没有反序列化功能点

JSONArray的toString调用机制

调用链分析

JSONArray类本身没有toString方法,它使用父类JSON的toString方法,这是触发getter方法的关键点:

  1. toString方法调用toJSONString方法
  2. toJSONString方法执行JSONSerializer#write方法
  3. 最终通过这一调用链达到getter方法触发的目的

详细流程

  1. JSONSerializer#write方法

    • 通过getObjectWriter获取一个ObjectSerializer的实现类
    • 这是fastjson序列化过程中的核心机制
  2. SerializeConfig#getObjectWriter方法

    • 获取对应class对象的ObjectWriter
    • 对于JSONArray(实现了List接口),获取到的是ListSerializer
  3. ListSerializer#write处理

    • 对JSONArray中的元素(JavaBean)调用getObjectWriter方法
    • 获取对应Bean类的ObjectWriter对象
    • 重新进入SerializeConfig#getObjectWriter的调用过程

JavaBean序列化创建过程

当遇到JavaBean时,序列化器的创建过程如下:

  1. createJavaBeanSerializer方法

    • 在常见对象映射不满足时调用
    • 经过简单黑名单过滤
    • 调用TypeUtils#buildBeanInfo提取JavaBean的类信息
  2. TypeUtils#buildBeanInfo

    • 为后续类生成做准备
    • 提取JavaBean的字段、方法等信息
  3. createASMSerializer方法

    • 最终通过该方法动态创建JavaBeanSerializer
    • 使用ASM技术生成高效的序列化器类

getter方法触发原理

在动态生成的序列化器中:

  1. 会扫描目标类的所有getter方法
  2. 在序列化过程中自动调用这些getter方法
  3. 将getter方法的返回值作为对象的属性值进行序列化

这一机制使得攻击者可以通过精心构造的JSON对象,触发特定类的getter方法,进而可能执行恶意代码。

安全防护建议

  1. 升级fastjson版本:使用最新版本,修复已知漏洞
  2. 启用safeMode:完全禁用autotype功能
  3. 自定义反序列化过滤器:严格控制可反序列化的类
  4. 黑名单机制:虽然fastjson内置了黑名单,但仍需根据业务补充

总结

fastjson通过动态生成序列化器的方式实现了高效的JSON处理,但这也带来了安全风险。理解其getter方法触发机制对于安全防护和漏洞挖掘都至关重要。开发者应当充分了解这些机制,才能更好地防御潜在的攻击。

Fastjson原生反序列化getter触发机制分析 前言 本文详细分析fastjson在解析JSON过程中如何触发getter方法,以及如何利用这一特性构建反序列化利用链。fastjson不仅能够作为反序列化Gadgets中的重要环节,还能通过特定方式直接触发目标对象的getter方法。 基本概念 fastjson中的可序列化类 在fastjson中,实现了 Serializable 接口的类很少,主要包括以下三类: AntiCollisionHashMap :实现了自己的 readObject 方法 JSONObject/JSONArray :这些类有自己的 readObject 方法,主要通过重写 ObjectInputStream#resolveClass 方法进行反序列化类的安全性检查 其他类:没有反序列化功能点 JSONArray的toString调用机制 调用链分析 JSONArray类本身没有 toString 方法,它使用父类JSON的 toString 方法,这是触发getter方法的关键点: toString 方法调用 toJSONString 方法 toJSONString 方法执行 JSONSerializer#write 方法 最终通过这一调用链达到getter方法触发的目的 详细流程 JSONSerializer#write方法 : 通过 getObjectWriter 获取一个 ObjectSerializer 的实现类 这是fastjson序列化过程中的核心机制 SerializeConfig#getObjectWriter方法 : 获取对应class对象的 ObjectWriter 对于JSONArray(实现了List接口),获取到的是 ListSerializer ListSerializer#write处理 : 对JSONArray中的元素(JavaBean)调用 getObjectWriter 方法 获取对应Bean类的 ObjectWriter 对象 重新进入 SerializeConfig#getObjectWriter 的调用过程 JavaBean序列化创建过程 当遇到JavaBean时,序列化器的创建过程如下: createJavaBeanSerializer方法 : 在常见对象映射不满足时调用 经过简单黑名单过滤 调用 TypeUtils#buildBeanInfo 提取JavaBean的类信息 TypeUtils#buildBeanInfo : 为后续类生成做准备 提取JavaBean的字段、方法等信息 createASMSerializer方法 : 最终通过该方法动态创建JavaBeanSerializer 使用ASM技术生成高效的序列化器类 getter方法触发原理 在动态生成的序列化器中: 会扫描目标类的所有getter方法 在序列化过程中自动调用这些getter方法 将getter方法的返回值作为对象的属性值进行序列化 这一机制使得攻击者可以通过精心构造的JSON对象,触发特定类的getter方法,进而可能执行恶意代码。 安全防护建议 升级fastjson版本 :使用最新版本,修复已知漏洞 启用safeMode :完全禁用autotype功能 自定义反序列化过滤器 :严格控制可反序列化的类 黑名单机制 :虽然fastjson内置了黑名单,但仍需根据业务补充 总结 fastjson通过动态生成序列化器的方式实现了高效的JSON处理,但这也带来了安全风险。理解其getter方法触发机制对于安全防护和漏洞挖掘都至关重要。开发者应当充分了解这些机制,才能更好地防御潜在的攻击。