文章目录
频繁出现的反序列化漏洞
最近公司的小伙伴们收到了一波安全工单,因为FastJson存在高危漏洞,要求将FastJson版本号升级到1.2.69及以上
漏洞描述如下
在Fastjson<=1.2.68的版本中,通过新的Gadgets链绕过autoType开关,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,实现了反序列化漏洞利用的远程代码执行效果,同时,此次修复补丁也补充了autoType黑名单,Fastjson历史版本中,autoType安全黑名单已被多次绕过,官方也一直在持续补充增强该黑名单,并在1.2.68版本中引入一个safeMode的配置,配置safeMode后,无论白名单和黑名单,都不支持autoType,不过默认并未开启该配置。由于autoType开关漏洞利用门槛较低,可绕过autoType限制,风险影响较大,建议尽快更新漏洞修复版本或采用临时缓解措施加固系统
从漏洞描述中可以大致猜测到,漏洞的产生和绕过AutoType安全校验有分不开的关系
parse()及parseObject()
FastJson中将JSON串反序列化成Java对象的两个常用方法是parse()及parseObject(),那么这两者有什么区别呢?
定义User测试类如下
package com.company.project.bean;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -8088742348807697485L;
private String userName;
public User() {
System.out.println("call construct method");
}
public String getUserName() {
System.out.println("call get method getUserName");
return userName;
}
public void setUserName(String userName) {
System.out.println("call set method setUserName");
this.userName = userName;
}
}
fastJson中parse方法或者parseObject都可以将JSON串转化成Java对象,定义如下序列化后的Json串,做测试
public static void main(String[] args) {
String userJson = "{\"@type\":\"com.company.project.bean.User\",\"userName\":\"testUserName\"}";
//parseObject测试
Object object1 = JSON.parseObject(userJson);
System.out.println("=============");
//parse
Object object2 = JSON.parse(userJson);
}
控制台中输出结果如下