某json <= 1.2.68 远程代码执行漏洞分析
字数 1366 2025-08-25 22:58:55
Fastjson <= 1.2.68 远程代码执行漏洞分析报告
漏洞概述
Fastjson在1.2.68及以下版本中存在一个可绕过AutoType机制的远程代码执行漏洞。该漏洞允许攻击者通过精心构造的JSON数据绕过安全限制,执行任意代码。该漏洞已在2020年6月1日发布的1.2.69版本中修复。
漏洞原理
AutoType机制简介
Fastjson的AutoType机制是为了防止恶意反序列化对象而设计的安全特性。默认情况下,只有白名单中的类和一些基础类型可以被反序列化。
漏洞核心 - checkAutoType方法
漏洞的核心在于ParserConfig.java中的checkAutoType方法,特别是其中的expectClass参数:
- 当
expectClass参数不为null,且当前需要实例化的类型是expectClass的子类或实现时,传入的类会被视为合法类(前提是该类不在黑名单中) - 通过
TypeUtils.loadClass返回该类型的Class对象
绕过机制
攻击者可以利用以下条件绕过AutoType限制:
- 找到一个白名单类,其构造方法或setter方法中含有
java.lang.Object这类子类众多的参数 - 构造一个反序列化链,利用
expectClass参数传递机制 - 最终加载并实例化恶意类
漏洞利用分析
关键利用点
- java.lang.AutoCloseable接口:该接口在
TypeUtils.mappings中,使用JavaBeanDeserializer反序列化器 - 接口反序列化特性:当反序列化接口类型时,Fastjson会继续解析下一个JSON字段
- expectClass传递:如果存在类型字段,会将接口类型作为
expectClass参数传入checkAutoType
利用链构造
构造如下JSON可实现利用:
{
"@type": "java.lang.AutoCloseable",
"@type": "com.cyx.A",
"cmd": "calc.exe"
}
利用步骤:
- 第一个
@type指定为java.lang.AutoCloseable(白名单/缓存中的合法接口) - 第二个
@type指定为com.cyx.A(恶意类,实现AutoCloseable接口) - 通过构造方法或setter方法注入恶意命令
为什么选择AutoCloseable
- 在
TypeUtils.mappings中已存在 - 实现类非常多,提供了广泛的选择空间
- 使用
JavaBeanDeserializer反序列化器,允许继续解析
修复方案
- 升级到1.2.69或更高版本:主要增加了黑名单项(从7项增加到10项)
- 黑名单改进:所有黑名单检查转为16进制Hash判断,提高安全性
- expectClass限制增强:加强了对
expectClass参数类型的检查
防御建议
- 及时升级Fastjson到最新版本
- 严格限制反序列化的类,使用白名单机制
- 避免使用Fastjson反序列化不可信的JSON数据
- 监控和过滤包含多个
@type字段的JSON请求
参考资源
漏洞影响
该漏洞影响所有使用Fastjson 1.2.68及以下版本的应用,允许攻击者在目标系统上执行任意代码,危害等级为高危。