json组件下的原生反序列化getter触发
字数 1544 2025-08-22 12:23:42
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
- 获取对应class对象的
-
ListSerializer#write处理:
- 对JSONArray中的元素(JavaBean)调用
getObjectWriter方法 - 获取对应Bean类的
ObjectWriter对象 - 重新进入
SerializeConfig#getObjectWriter的调用过程
- 对JSONArray中的元素(JavaBean)调用
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方法触发机制对于安全防护和漏洞挖掘都至关重要。开发者应当充分了解这些机制,才能更好地防御潜在的攻击。