FastJson的调用逻辑 (根据代码执行结果分析)
Fastjson漏洞产生在将 JSON字符串 反序列化为 JavaBean的过程中。
这是一段使用 parseObject()方法将 JSON字符串反序列化的代码:
User类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import java.util.Map;
public class User { private int id; private int age; private String name; private Map map;
public Map getMap() { System.out.println("getMap"); return map; }
@Override public String toString() { return "User{" + "id=" + id + ", age=" + age + ", name='" + name + '\'' + '}'; }
public int getId() { System.out.println("getId方法被调用"); return id; }
public void setId(int id) { this.id = id; System.out.println("setId : " + id); }
public int getAge() { System.out.println("getAge方法被调用"); return age; }
public void setAge(int age) { this.age = age; System.out.println("setAge : " + age); }
public String getName() { System.out.println("getName方法被调用"); return name; }
public void setStudentName(String name) { this.name = name; System.out.println("setName : " + name); }
}
|
JSONUser类:
1 2 3 4 5 6 7 8 9 10
| import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;
public class JSONUser { public static void main(String[] args) { String s = "{\"@type\": \"com.xxxx.fastjson_demo.model.User\", \"age\":18,\"studentName\":\"admin\"}"; JSONObject jsonObject = JSONObject.parseObject(s); System.out.println(jsonObject); } }
|
可以看到 JSON字符串中的 “studentName” : “admin”,而不是 “name” : “admin”,是因为要向 setStudentName看齐:
“studentName” 运行结果 -> setStudentName()方法被调用
“name” 运行结果 -> setStudentName()方法未被调用
这个例子也就解释了为什么 Fastjson 1.2.24 - JdbcRowSetImpl链 POC中 需要给 autoCommit参数单独赋值(true和 false都行),原因就是不赋值调用不了 setAutoCommit方法。