Fastjson反序列化漏洞

关于 fastjson:简单来说就是将 java 对象转为 json 字符串,将 json 字符串转为 java 对象。以下是其中两个方法的简单使用,详情可以自行百度。

toJSONString :将对象转为 json 字符串。其中 SerializerFeature.WriteClassName 参数会使结果多一个 @type 的参数,在对该 JSON 数据进行反序列化的时候,会去调用指定类中对于的 get/set/is 方法。例如 {"@type":"User","age":12,"username":"hello"} 在进行反序列化是就会调用 User 类里的 get 和 set 方法。

String jsonString1 = JSON.toJSONString(user1);  
System.out.println(jsonString1);  // {"age":12,"username":"hello"}  
  
String jsonString2 = JSON.toJSONString(user1, SerializerFeature.WriteClassName);  
System.out.println(jsonString2);  // {"@type":"User","age":12,"username":"hello"}

parseObject:将 json 字符串转为 java 对象,同时调用 set 和 get 方法

// 在User类的set和get方法中添加输出语句方便调试
String jsonString3 = "{\"@type\":\"User\",\"age\":12,\"username\":\"hello\"}";  
Object parse2 = JSONObject.parseObject(jsonString3);  
System.out.println(parse2);
------------输出结果--------------
setAge方法被调用
setUsername方法被调用
getAge方法被调用
getUsername方法被调用
{"age":12,"username":"hello"}

假如我们在 User 类的 set 或 get 方法中添加恶意代码,它就会在反序列化时自动被执行。

所以,我们在实际利用是,