某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参数:

  1. expectClass参数不为null,且当前需要实例化的类型是expectClass的子类或实现时,传入的类会被视为合法类(前提是该类不在黑名单中)
  2. 通过TypeUtils.loadClass返回该类型的Class对象

绕过机制

攻击者可以利用以下条件绕过AutoType限制:

  1. 找到一个白名单类,其构造方法或setter方法中含有java.lang.Object这类子类众多的参数
  2. 构造一个反序列化链,利用expectClass参数传递机制
  3. 最终加载并实例化恶意类

漏洞利用分析

关键利用点

  1. java.lang.AutoCloseable接口:该接口在TypeUtils.mappings中,使用JavaBeanDeserializer反序列化器
  2. 接口反序列化特性:当反序列化接口类型时,Fastjson会继续解析下一个JSON字段
  3. expectClass传递:如果存在类型字段,会将接口类型作为expectClass参数传入checkAutoType

利用链构造

构造如下JSON可实现利用:

{
  "@type": "java.lang.AutoCloseable",
  "@type": "com.cyx.A",
  "cmd": "calc.exe"
}

利用步骤:

  1. 第一个@type指定为java.lang.AutoCloseable(白名单/缓存中的合法接口)
  2. 第二个@type指定为com.cyx.A(恶意类,实现AutoCloseable接口)
  3. 通过构造方法或setter方法注入恶意命令

为什么选择AutoCloseable

  1. TypeUtils.mappings中已存在
  2. 实现类非常多,提供了广泛的选择空间
  3. 使用JavaBeanDeserializer反序列化器,允许继续解析

修复方案

  1. 升级到1.2.69或更高版本:主要增加了黑名单项(从7项增加到10项)
  2. 黑名单改进:所有黑名单检查转为16进制Hash判断,提高安全性
  3. expectClass限制增强:加强了对expectClass参数类型的检查

防御建议

  1. 及时升级Fastjson到最新版本
  2. 严格限制反序列化的类,使用白名单机制
  3. 避免使用Fastjson反序列化不可信的JSON数据
  4. 监控和过滤包含多个@type字段的JSON请求

参考资源

  1. Fastjson GitHub仓库
  2. Fastjson 1.2.69发布说明
  3. Fastjson黑名单项目

漏洞影响

该漏洞影响所有使用Fastjson 1.2.68及以下版本的应用,允许攻击者在目标系统上执行任意代码,危害等级为高危。

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 (恶意类,实现AutoCloseable接口) 通过构造方法或setter方法注入恶意命令 为什么选择AutoCloseable 在 TypeUtils.mappings 中已存在 实现类非常多,提供了广泛的选择空间 使用 JavaBeanDeserializer 反序列化器,允许继续解析 修复方案 升级到1.2.69或更高版本 :主要增加了黑名单项(从7项增加到10项) 黑名单改进 :所有黑名单检查转为16进制Hash判断,提高安全性 expectClass限制增强 :加强了对 expectClass 参数类型的检查 防御建议 及时升级Fastjson到最新版本 严格限制反序列化的类,使用白名单机制 避免使用Fastjson反序列化不可信的JSON数据 监控和过滤包含多个 @type 字段的JSON请求 参考资源 Fastjson GitHub仓库 Fastjson 1.2.69发布说明 Fastjson黑名单项目 漏洞影响 该漏洞影响所有使用Fastjson 1.2.68及以下版本的应用,允许攻击者在目标系统上执行任意代码,危害等级为高危。