赞
踩
fastjson 是 java 中常用的一个用来序列化反序列化 JSON 数据的库。因其优异的性能表现,在 java web 开放中应用比较广泛。最近需要写一个 fastjson 的检测插件,稍微研究了一下后,感觉有一个比较不错的检测方法,在这里和大家分享下。
在文章开始之前我想说明一点这里介绍的是检测方法而不是利用方法。这是两个不同的目标实现这两个目标需要考虑的细节也是不同的。在做漏洞检测时尤其是自动化检测时关注的往往有以下几点:
围绕着这几点我这个从未接触 java 安全的弟弟打开了 idea ,开始了 fastjson 反序列化 debug 之路。
我刚接触的时候,感觉很多文章都在说@type
,但@type
是什么,为什么需要@type
大家好像都没有提及,而且既然@type
这么多问题,官方为何不去掉这个用法。带着这些疑问,我写了一个简单的 case,在 1.2.24 版本运行一下:
- public class User {
- private String name;
-
- public User() {
- System.out.println("User()");
- }
-
- public String getName() {
- System.out.println("getName");
- return name;
- }
-
- public void setName(String name) {
- System.out.println("setName");
- this.name = name;
- }
- }
-
- class Testfastjson {
- public static void main(String[] args) {
- String x = "{"name": "test"}";
- Object xx = JSON.parseObject(x);
- System.out.println(xx);
- System.out.println();
-
- String y = "{"@type":"com.koalr.fastjson.User","name": "test"}";
- User yy = (User) JSON.parse(y);
- System.out.println(yy);
- System.out.println();
-
- String z = "{"name": "test"}";
- User zz = (User) JSON.parseObject(z, User.class);
- System.out.println(zz);
- }
- }
结果为:
- {"name":"test"}
-
- User()
- setName
- com.koalr.fastjson.User@18769467
-
- User()
- setName
- com.koalr.fastjson.User@46ee7fe8
仔细观察这个这个 case,它主要说明了两点:一是如果没有指定类型,得到的是 fastjson 的内置类型 JSONObject
,这个模式下没有类型信息,使用起来和 python dict 比较像;二是如果用某种方式制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。