通过发送 JSON 来执行命令?了解 Ruby 项目中不安全的反序列化漏洞如何运作

本文主要是介绍通过发送 JSON 来执行命令?了解 Ruby 项目中不安全的反序列化漏洞如何运作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

攻击者是否可以通过发送 JSON 在远程服务器上执行任意命令?是的,如果正在运行的代码包含不安全的反序列化漏洞。但这怎么可能呢?

在这篇博文中,我们将描述不安全反序列化漏洞的工作原理以及如何在 Ruby 项目中检测它们。这篇博文中的所有示例都是使用 Ruby 的 Oj JSON 序列化库制作的,但这并不意味着它们仅限于此库。在这篇博文的最后,我们将链接到一个存储库,其中包含适用于 Oj (JSON)、Ox (XML)、Psych (YAML) 和 Marshal (自定义二进制格式) 的有效示例漏洞,并向您展示 CodeQL 如何检测此类漏洞。了解不安全反序列化的工作原理可以帮助您完全避免此类错误,而不是专注于避免某些方法。

内容

  • 一步步:为 Oj 构建检测工具链
  • 将检测工具扩展为成熟的通用远程代码执行链
  • 在源代码可用时检测不安全的反序列化

一步步:为 Oj 构建检测工具链

许多人都知道如何利用反序列化漏洞。但它究竟是如何运作的呢?(这既是魔法,也是汗水和泪水。)在本节中,我们将展示如何为 Oj(一个基于 Ruby 的 JSON 反序列化库)构建一个调用外部 URL 的不安全反序列化检测小工具。此检测小工具基于 William Bowling(又名vakzz)为 Marshal 和 Ruby 3.0.3 开发的通用反序列化小工具,适用于 Oj 和 Ruby 3.3。

1. 从课程开始

大多数情况下,不安全的反序列化漏洞都与反序列化库支持多态性的能力有关,这意味着能够实例化序列化数据中指定的任意类或类状结构。然后,攻击者将这些类链接在一起,在被利用的系统上执行代码。所有使用的类通常都必须由被利用的项目访问。在这种情况下,用于特定目的(例如执行命令或代码)的类称为小工具。而通过将这些类组合起来成为更大漏洞的一部分(例如,通过嵌套它们),我们得到了所谓的小工具链。序列化和反序列化任意构造的能力长期以来被视为一项强大的功能,它最初并非用于代码执行。2015 年,随着 FoxGlove Security 发布了一篇关于广泛存在的 Java 反序列化漏洞的博客文章,公众对此功能的看法发生了变化。2017 年,BlackHat 上展示了针对基于 Java 和 .NET 的 JSON 库的不安全反序列化攻击,标题为“ 13 号星期五:JSON 攻击”。

当使用名为 Oj 的(非默认)Ruby 库反序列化 JSON 时,项目很容易受到攻击,只需构造如下内容即可:

data = Oj.load(untrusted_json)

Oj 库默认支持 JSON 中指定的类的实例化。可以通过指定附加参数或使用来禁用此行为Oj.safe_load

正如介绍中所提到的,不安全的反序列化漏洞不仅限于 JSON;它们可能发生在从用户控制的数据反序列化的任意类或类似类的结构的任何地方。

要实例化一个名称为 且具有内容为MyClass的字段的类,必须将以下 JSON 传递给易受攻击的 Oj 接收器。membervalue

{"^o": "MyClass","member": "value"
}

2. 接下来是映射(哈希)、列表、getter、setter、构造函数等

虽然类的实例化是反序列化不安全漏洞最常见的特征,但接下来的构造块因语言而异。虽然在 Java 和类似语言中,反序列化不安全漏洞有时会使用构造函数、setter 和 getter 来初始触发代码执行,但对于 Ruby 反序列化漏洞,我们不能依赖它们。Vakzz的博客文章是关于 Ruby 二进制 Marshal 序列化的利用,它依赖于一种所谓的魔术方法(在序列化对象重建中调用的方法)_load(类似于 Java 的readObject)来触发代码执行。但是,Oj 不会调用这个魔术方法,因此为了触发我们的小工具链的执行,我们不能依赖这个方法,而必须找到其他方法。

首先回答这个问题:我们可以使用什么来触发 Oj 中的代码执行?

方法hash(code)

Oj 并不是我们依赖该hash方法作为小工具链启动的唯一反序列化库。hash当反序列化库将键值对添加到哈希图(在 Ruby 中简称为哈希本身)时,通常会在键对象上调用该方法。

下表展示了 Ruby 中流行的序列化库的启动方法:

图书馆输入数据课堂内开球方法
元帅(红宝石)二进制_load
橙汁JSONhash(类需要作为键放入哈希(映射)中)
XMLhash(类需要作为键放入哈希(映射)中)
心理学(红宝石)YAMLhash(类需要作为键放入哈希(映射)中)
init_with
JSON (Ruby)JSONjson_create([参见最后关于 json_create 的注释](#table-vulnerable-sinks))

让我们创建一个小的概念证明来演示如何使用该hash方法启动我们的小工具链。

我们假设我们有一个类,例如下面的类,在目标 Ruby 项目中可用(提示:在实际项目中不会有这样的小工具):

class SimpleClassdef initialize(cmd)@cmd = cmdenddef hashsystem(@cmd)end
end

调用“hash”将使用“system”执行“@cmd”成员变量中的命令。请注意,在 Oj 反序列化过程中,不会执行构造函数。在这里,我们使用它自己创建一个快速示例有效负载并转储生成的 JSON:

require 'oj'simple = SimpleClass.new("open -a calculator") # command for macOSjson_payload = Oj.dump(simple)
puts json_payload
注意:虽然直接序​​列化单个小工具可能有意义,但序列化甚至只是调试整个小工具链通常很危险,因为它可能会在序列化过程中触发链的执行(这不会给你预期的结果,但你会“利用”你自己的系统)。

有效载荷 JSON 如下所示:

{"^o": "SimpleClass","cmd": "open -a calculator"
}

如果我们现在加载这个 JSON,什么Oj.load也不会发生。为什么?因为实际上没有人调用 hash 方法。</

这篇关于通过发送 JSON 来执行命令?了解 Ruby 项目中不安全的反序列化漏洞如何运作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104528

相关文章

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co