fastjson反序列化原理是什么?反序列化漏洞利用原理

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。在使用fastjson的时候,我们会遇到序列化以及反序列化,那fastjson反序列化原理是什么?下面来我们就来给大家讲解一下。

漏洞被利用本质找到一条有效的攻击链,攻击链的末端就是有代码执行能力的类,来达到我们想做的事情,一般都是用来RCE(远程命令执行)。构造一个触发器,也就是通过什么方式来让攻击链执行你想要的代码。触发器可以通过很多方式,比如静态代码块、构造方法等等。

Fastjson反序列化漏洞被利用的原因,可以归结为两方面:

Fastjson提供了反序列化功能,允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名;

Fastjson自定义的反序列化机制会使用反射生成上述指定类的实例化对象,并自动调用该对象的setter方法及部分getter方法。

攻击者可以构造恶意请求,使目标应用的代码执行流程进入这部分特定setter或getter方法,若上述方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。官方采用了黑名单方式对反序列化类名校验,但随着时间的推移及自动化漏洞挖掘能力的提升。新Gadget会不断涌现,黑名单这种治标不治本的方式只会导致不断被绕过,从而对使用该组件的用户带来不断升级版本的困扰。

对编程人员而言,在使用Fastjson反序列化时会使用到Fastjson所提供的几个静态方法:

parse (String text)
parseObject(String text)
parseObject(String text, Class clazz)

无论使用上述哪种方式处理JSON字符串,都会有机会调用目标类中符合要求的Getter方法或者Setter方法,如果一个类中的Getter或者Setter方法满足调用条件并且存在可利用点,那么这个攻击链就产生了。

为了理解利用过程,在本地环境演示Fastjson反序列化漏洞POC利用过程,为显示效果直观,直接弹出计算器。

import java.io.IOException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
class Poc
{
    private String cmd;
    public Poc()
    {
        System.out.println("Poc() is called");
    }
    public String getCmd()
    {
        System.out.println("getCmd() is called");
        return cmd;
    }
    public void setCmd(String cmd) throws IOException
    {
        System.out.println("setCmd is called");
        this.cmd = cmd;
        Runtime.getRuntime()
            .exec(cmd);
    }
}
public class TestPoc
{
    public static void main(String[] args)
    {
        String Poc = "{\"@type\":\"poc.test.Poc\",\"cmd\":\"calc\"}";
        JSONObject b = JSON.parseObject(Poc);
    }
}

Fastjson允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名,为了让服务端按照指定类型反序列化,所以这里再引入一个@type。通过type指定了反序列化的类型,在给parseObject传参时,@type指定了当前字符串按照Poc类来解析。在Poc类中写了一个无参构造方法、getter和setter方法。根据结果显示,在反序列化时同时调用了无参构造函数以及getter和setter方法,setter方法中中通过exec执行了外部命令计算器。

fastjson反序列化原理是什么?反序列化漏洞利用原理.png

这就是Fastjson反序列化漏洞利用原理,大家在工作中对Fastjson反序列化漏洞要有更进一步的认识,提高重视程度,遇到问题也要及时解决哦!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

java代码写好后怎么运行?java有哪些运行方式?

java中继承和接口的区别是什么?java继承有什么特性?

java程序培训多少钱?java线上培训好还是线下好?