WEB安全--Java安全--Fastjson反序列化原理初探

发布于:2025-07-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、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指定该类,并且解析的字符串中的内容是要执行的命令,运行程序->命令执行。


网站公告

今日签到

点亮在社区的每一天
去签到