一、Fastjson的基本功能
1.1、将json字符串解析为json对象
这里的fastjson包版本为1.2.24,通过pom的方式即可导入
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
</dependencies>
可以看到在运行主类后,发现字符串被处理为json对象打印出来了
当然也可以提取出json对象中的具体值
1.2、将json字符串解析为JavaBean
JavaBean(一种格式,拥有构造方法和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指定该类,并且解析的字符串中的内容是要执行的命令,运行程序->命令执行。