JSON 注入攻击 API

文章目录

  • JSON 注入攻击 API
    • "注入所有东西"是"聪明的"
      • 发生了什么?
    • 什么是 JSON 注入?
    • 为什么解析器是问题所在
      • 解析不一致
    • JSON 解析器互操作性中的安全问题
      • 处理重复密钥的方式不一致
      • 按键碰撞响应不一致
      • JSON 序列化(反序列化)中的不一致
    • 好的。JSON 解析器很烂。我该如何利用它?
    • 结论

JSON 注入攻击 API

我想给你讲一个不久前的故事。利用三星设备中的 JSON 注入漏洞可能触发攻击链,最终导致设备上的代码执行。

这听起来像是某些烂黑客电影里的情节。但事实并非如此。

这可以作为一个教训,告诉人们如何滥用盲目信任其有效负载中的 JSON 的 API。

让我们看看吧。

“注入所有东西"是"聪明的”

你知道过去几年物联网是如何风靡一时的吗?如今一切都变得"智能"。从智能灯泡到智能电视,从智能冰箱到智能集线器,从恒温器到摄像头。如果设备有电子设备,供应商就会试图用软件让它"更智能"。

问题是,许多此类设备都处于受限环境中。通常运行某种嵌入式 Linux 来驱动片上系统(SOC)硬件上的代码。这使得其 HTTP 服务器(以及支持库,如 JSON 解析器)受到一定限制。

三星 Smart Hub 就是这种情况。他们的移动应用程序可以与集线器进行远程通信并控制与其连接的任何设备。

该集线器的功能之一是能够使用 RTSP 协议连接到智能摄像头并处理其直播流。此代码在以 root video-core 身份运行的进程中运行。

通过向端点发送恶意 POST 请求 /credentials, 可以修改集线器用于连接远程服务器的凭据,并以导致 SQL 注入并最终导致远程代码执行的方式污染数据。

以 root 身份,在中央控制器上管理网络上的所有物联网。

发生了什么?

此端点在处理 JSON 主体的整个过程中未对参数进行任何清理。此外,三星所依赖的库(json-c)是使用编译的 JSON_TOKENER_STRICT=0,允许使用单引号和双引号定义字符串。

这个小事实将允许攻击者注入任意字段以在中心的内部 sqlite 数据库中创建自定义列。您可以看到这是怎么回事。它以堆叠查询和执行任意代码结束。

这是一个非常有趣的攻击链。实际上可以将过长的 ROP 链插入 camera 表中,然后向端点发送 DELETE /cameras,这最终会导致视频核心进程尝试读取数据并最终崩溃,从而导致传统的基于堆栈的缓冲区溢出。

您可以在此处阅读 Cisco TALOS 的一篇精彩文章。该漏洞成为 CVE-2018-3879,与 CVE-2018-3880 结合后,CVSS 评级为 9.9。

那么,我们在这里学到了什么?

JSON 注入 → SQL 注入 → 缓冲区溢出 → ROP = PWNED

这只是现实世界中的一个示例。还有很多其他示例。但让我们来探索一下为什么这种方法有效,以及我们在攻击 API 时如何利用这种方法。

什么是 JSON 注入?

JSON 注入是一种漏洞,允许攻击者将恶意数据插入 JSON 流,从而可能改变应用程序行为或触发意外操作。

当来自不受信任来源的数据未经过服务器正确清理并被代码直接或间接利用时,就会发生服务器端 JSON 注入。就像三星智能中心的运作方式一样。

有几种方法可以做到这一点,例如通过结构化格式注入(SFI)。我不会详尽地介绍这一点,因为我之前在利用结构化格式注入利用 API 中写过这方面的内容。

我希望你思考的是为什么会发生这种情况。没有单一的答案。它比这更微妙。

而且随着 API 用越来越多不同的语言编写,情况只会变得更糟。

这都是因为 JSON 解析器及其使用方式不一致造成的。

为什么解析器是问题所在

我认为可以说 JSON 已成为大多数 API 通信的支柱。它的简单性在威胁模型中经常被忽视,因为我们非常依赖和信任它们的结构。

然而,在现代 Web 应用程序和 API 中,请求管道中可能会使用多个解析器,每个解析器都有自己的怪癖和漏洞。解析器之间的差异加上多阶段请求处理可能会带来严重的漏洞。

但这是为什么呢?

解析不一致

即使在最好的解析器实现中,与规格的细微偏差也是不可避免的。

JSON 解析器也面临挑战,因为官方 JSON RFC 对重复键和数字表示等主题没有做出明确规定。尽管有关于互操作性的警告,但大多数 JSON 解析器用户并未意识到这些警告。

说实话…在使用库处理数据(反)序列化之前,您上次阅读 RFC 是什么时候?

最重要的是,官方 RFC 并不是唯一的规范。你还有 ECMAScript、JSON5、HJSON,甚至二进制 JSON (BSON)。

这可能让人抓狂。解析器之间的互操作性暴露了许多人甚至没有意识到的安全风险。

让我给你举几个例子。

JSON 解析器互操作性中的安全问题

JSON 解析器之间存在一些互操作性安全问题。BishopFox 对该主题进行了一些出色的研究,我在此总结一下。如果您对这些问题感兴趣,我强烈建议您查看他们关于该主题的研究。

处理重复密钥的方式不一致

我希望你考虑一下这个例子:

fu = {"bar": 1, "bar": 2}

的值是否 fu[“bar”] 等于1或2?或者会产生错误?

根据官方规范,任何结果都是完全可以接受的。如果你总是期望它以特定的方式工作,那就有问题了。

因此,如果您有一个用 Python Flask 编写的前端公开 API,它会使用最后一个键的优先级,结果为 2。

但是,如果该有效负载被转发到后端的单独微服务进行进一步处理,情况会怎样?假设它是用 Golang 编写的。那么,它使用第一键优先,结果为 1。

看到这里的问题了吗?

因此,您需要确保在依赖 JSON 对象的代码中正确理解顺序优先级。否则,这可能会成为一种可能的攻击媒介,您可以通过以特定顺序使用重复键来操纵业务逻辑,使其以意想不到的方式工作。

这就是为什么在侦察过程中检测 API 组件的编程语言非常重要。您需要了解正在使用的语言,并尝试找出 JSON 对象的解析方式。

按键碰撞响应不一致

当解析器以不一致的方式处理特殊字符或注释时,就会发生键冲突。

例如,在 Python 2.x 中,JSON 解析器在处理某些 Unicode 的方式上有所不同。

考虑以下 JSON 块:

{"bar":1,"bar\ud888":2}

默认 JSON 解析器会将其干净地处理为两个不同的键。但是,Python 中流行的 ujson 解析器会截断 Unicode,将键视为重复项,并接受 Python 的最后一个键优先级。结果如何?标准 JSON 解析器将 bar 的值视为 1,而 uJSON 解析器将 bar 的值视为 2。

查看下面的屏幕截图,了解实际操作的示例……

JSON 序列化(反序列化)中的不一致

虽然我们一直在讨论键的优先级,但我们实际上一直在展示反序列化过程中的问题。事实上,这也可能发生在序列化过程中。

有时序列化和反序列化本身是不一致的。

以 Java 的 JSON 迭代器为例……

输入:

fu = {"bar": 1, "bar": 2}

输出:

fu["bar"] // 1
fu.toString() // {"bar": 2}

所以在同一个解析器中,键的检索和序列化的值是不同的。底层数据结构保留了重复键的值,但序列化器和反序列化器之间的优先级不一致。

JSON RFC 不会阻止重复键的序列化。因此,您必须依赖于理解所有组件中数据序列化和反序列化过程中键的顺序优先顺序。

举个例子,C++ rapidjson 解析器会以不同的方式处理相同的数据:

输入:

fu = {"bar": 1, "bar": 2}

输出:

fu["bar"] // 2
fu.toString() // {"bar": 1, "bar": 2}

如您所见,相同的 JSON 对象在解析时可能会得到不同的结果。重新序列化这些对象并不能提供任何保护,因为数据可能会有所不同,从而使攻击者能够绕过清理逻辑偷偷获取值。

这可能导致业务逻辑缺陷、注入漏洞或其他安全风险。

好的。JSON 解析器很烂。我该如何利用它?

希望您能够看到如何滥用 JSON 并注入可能导致应用程序以开发人员未预料的方式运行的数据。除了我之前提到的结构化格式注入之外,当您可以操纵数据如何在 API 基础架构内遍历组件时,您就可以开始控制逻辑流程。

例如,如果您知道 JSON 对象直接序列化到数据库(例如 MongoDB、Couchbase、DynamoDB、CosmosDB 等)并反序列化到使用不同解析器的外部组件,那么就有机会污染数据并查看它如何进出 API。

考虑一个类似这样的 API 请求流程:

输入清理阻止创建管理员POST /user/create HTTP/1.1
...
Content-Type: application/json
{"user": "dana", "role": "administrator"
}HTTP/1.1 401 Not Authorized
...
Content-Type: application/json{"Error": "Assignment of internal role 'administrator' is forbidden"}

因此我们可以看到输入验证不允许我们将角色设置为管理员。

了解解析器如何处理输入允许您利用解析器的行为以您可以操纵的方式解释数据,从而潜在地绕过输入清理。

想想之前的 Python 示例。想象一下,如果您使用 Unicode 字符截断帐户创建对象中名为"role"的键中的值。突然间,“administrator\ud888"被解析为"administrator”,并且 API 内的 privesc 成为可能。

最终看起来是这样的:

JSON 注入允许绕过清理以获得管理员权限POST /user/create HTTP/1.1
...
Content-Type: application/json
{"user": "dana", "role": "administrator\ud888"
}HTTP/1.1 200 OK
...
Content-Type: application/json{"result": "OK: Created user 'dana' with the role of 'administrator'"}

这就是 JSON 注入的最高境界,这要归功于奇特的 JSON 解析器。

结论

对三星智能中心的攻击只是 JSON 注入如何导致一系列复杂的漏洞链(从 SQL 注入到远程代码执行)的一个例子。

正如我们所见,根本原因通常在于 JSON 解析器处理数据的方式不一致,尤其是当涉及具有不同怪癖的多个解析器时。这些漏洞凸显了了解 JSON 在 API 基础架构中的不同语言和组件之间解析和处理方式的细微差别的重要性。

通过彻底审查 JSON 对象的序列化、反序列化和处理方式,您可以开始弄清楚如何制作可以绕过清理过滤器并影响业务逻辑的有效负载。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution {Random rand;List<Integer> arr;int[][] rects;public Solution(int[][] rects) {rand new Random();arr new ArrayList<Integer>();arr.add(0);this.rects rects;for (int[] rect : rects) {int a rect[0…

PPT自动化:Python如何将PPT转换为图片(ppt2img源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT转换图片 📒📝 Windows环境下PPT转为图片(源码)📝 Linux环境下PPT转为图片(源码)📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在日常工作中,我们常常需要将大量的幻灯片转换为图片,这样不仅方便分享,还能提…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据定义(超详细)

教材&#xff1a; 数据库系统概论&#xff08;第6版&#xff09;王珊,杜小勇,陈红编著 目录 一、SQL概述 1.1 SQL 的产生与发展 1.2 SQL的特点 1.3 SQL的基本概念 二、数据定义 2.1 数据库的定义 2.2 数据表的定义 2.3 模式的定义 一、SQL概述 1974年IBM为关系DBMS设…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

用HTML构建酷炫的文件上传下载界面

1. 基础HTML结构 首先&#xff0c;我们构建一个基本的HTML结构&#xff0c;包括一个表单用于文件上传&#xff0c;以及一个列表用于展示已上传文件&#xff1a; HTML <!DOCTYPE html> <html> <head><title>酷炫文件上传下载</title><link …

分布式ID生成策略

文章目录 分布式ID必要性1.UUID2.基于DB的自增主键方案3.数据库多主模式4.号段模式5.Redis6.Zookeeper7.ETCD8.雪花算法9.百度(Uidgenerator)10.美团(Leaf)11.滴滴(TinyID) 分布式ID必要性 业务量小于500W的时候单独一个mysql即可提供服务&#xff0c;再大点的时候就进行读写分…

浏览器播放rtsp视频流解决方案

方案一: html5 websocket_rtsp_proxy 实现视频流直播 实现原理 实现步骤 服务器安装streamedian服务器 客户端通过video标签播放 <video id"test_video" controls autoplay></video><script src"free.player.1.8.4.js"></script&g…

openresty通过header_filter_by_lua记录特定的请求头和特定的响应头到日志文件

有时我们希望记录特定的请求头信息和特定的响应头信息,以便能够通过关联请求信息和响应头信息,来实现记录请求和响应的对应关系。这里通过逐步尝试和优化的方式进行尝试。具体包括将需要的请求头和响应头组织到一条日志记录,输出到单独的错误日志文件记录等的配置尝试。 1.…

HAL+M4学习记录_8

一、TIM的HAL库用法 这里记录学习HAL库开发TIM 1.1 定时中断基本结构 这里给出定时中断的基本结构 基本步骤如下 开启时钟选择时基单元时钟源配置时基单元配置输出中断控制&#xff0c;允许更新中断输出到NVIC配置NVIC&#xff0c;打开定时器中断通道运行控制编写中断服务函…

为什么九齐单片机中不能使用bit?

如果开发环境不支持bit 定义static unsigned char task_720ms_flag 0;还可以用什么方式替代bit定义标志&#xff0c;使其占用内存空间小。 如果开发环境不支持位定义&#xff0c;可以使用 unsigned char 的多个状态位来替代。可以将多个标志合并到一个 unsigned char 中&…

Vue - Element 选择器 el-select 既可以选择下拉又可以手动输入文本功能(手动输入的值只能是数字 并且支持4位小数)

Vue - Element 选择器 el-select 既可以选择下拉又可以手动输入文本功能&#xff08;手动输入的值只能是数字 并且支持4位小数&#xff09; 备注 filterable 下拉框开启快速搜索功能 no-match-text 当输入的内容在下拉框中找不到时&#xff1b;下拉框提示的文字 handFocus 触发…

软件测试快速入门:测试对象、过程模型、生命周期与测试用例

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

redis集群介绍

Redis集群是一种分布式存储系统&#xff0c;它通过将数据分散存储在多个Redis节点上来实现可扩展性和高可用性。每个节点都是一个独立的Redis服务器实例&#xff0c;它们通过网络相互连接&#xff0c;共同协作以提供数据服务。 在Redis集群中&#xff0c;数据被划分为多个槽&am…

【Vercel】Vercel静态部署踩坑

背景 在现代的软件开发中&#xff0c;自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台&#xff0c;提供了与GitHub的无缝集成&#xff0c;使得开发者能够在每次提交代码后自动触发部署流程。然而&#xff0c;自动化部署过程中可能会遇到一些挑战&#xff0…

自动化工具:Ansible

目录 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 三、安装部署Ansible 1、环境部署 2、管理节点安装 Ansible 3、查看Ansible相关文件 4、配置主机清单 5、免密管理 ssh-keygen 5.1、测试连通性 5.2、简洁输…

IPC通信-消息队列

使用消息队列实现两个进程的相互通信 #include<myhead.h>//定义结构体存储信息种类和信息正文 typedef struct {long mtype; //信息类型char mtext[128]; //信息正文 }msgbuf;//宏定义信息正文的大小 #define MESIZE sizeof(msgbuf)-sizeof(long)typedef struct sockad…

vscode:创建fastapi项目

1.选择py解释器 或者 uvicorn main:app --reload

java游戏网站源码

题目&#xff1a;java游戏网站源码 编号B22A390 主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Mysql|大数据|SSM|SpringBoot|Vue|Jsp|MYSQL等)、学习资料、JAVA源码、技术咨询 文末联系获取 感兴趣可以先收藏起来&#xff0c;以防走丢&#xff0c;有任何选题、文档编…

雷池WAF自动化实现安全运营实操案例终极篇

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中&#xff0c;archetype&#xff08;原型&#xff09;用来表示一个world里具有相同component类型组合的entity。也就是说&#xff0c;相同component类型的entity在Unity内部会存储到一起&#xff0c;共享同一个archetype。 使用这样的设…