
一、Fastjson的基本功能1.1、将json字符串解析为json对象这里的fastjson包版本为1.2.24通过pom的方式即可导入dependencies dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.24/version /dependency /dependencies可以看到在运行主类后发现字符串被处理为json对象打印出来了当然也可以提取出json对象中的具体值1.2、将json字符串解析为JavaBeanJavaBean一种格式拥有构造方法和get、set方法的类这里在方法中添加了打印字符串方便观察方法被调用的情况运行主类可以发现输出结果明显和普通json对象不同由于我们指定了解析的对象是Person类所以调用了Person类中的constructor、setName和setAge方法这个是毫无疑问的但是我们还能看到调用了getAge方法却没有调用另一个getName方法这时因为在输出时指定了person对象的getAge方法的缘故如果不指定方法就是下面的结果1.3、type指定解析的对象这里我们对字符串的解析方式和第一种1.1是如出一辙的虽然结果貌似没有区别但是通过打印的方法名我们可以知道这个字符串还是被当做JavaBean解析了这是为什么呢如果细看可以发现字符串中多出了下面的信息通过这种方式使程序按照对Person对象的形式去处理json字符串type:org.example.Person也就是说当我们传入的json字符串中包含type:xx.xx.xx的信息如果路径存在就会控制程序按某个类去执行我们的json字符串。利用type可以指定让fastjson去接收我们想要的类而最关键的是这个type可以被我们抓包改掉他这里是无条件信任了前端传入的数据二、Fastjson反序列化漏洞2.1、漏洞原理何为fastjson反序列化呢如果联想到将json字符串解析为JavaBean的过程我们不难知道在json字符串被解析为java对象时会调用指定类中的set方法这个过程就是反序列化与之对应的还有序列化也就是将java对象转换为json字符串这一过程Json字符串 ————反序列化————Java对象Java对象 ————序列化———— Json字符串其实Fastjson反序列化漏洞的本质也就是java反序列化漏洞因为在将Json字符串反序列化为Java对象这个过程中会执行type指定类中的construct和set方法如果这些方法中存在危险操作的话就会产生严重危害命令执行。2.2、测试为了模拟该漏洞在下面创建了一个类Test其中包含着setCmd的命令执行方法通过AutoType指定该类并且解析的字符串中的内容是要执行的命令运行程序-命令执行。