「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞,攻击者能够干扰应用程序对NoSQL数据库进行的查询,本文我们将研究如何测试一般的NoSQL漏洞,然后重点研究如何利用MongoDB中的漏洞(MongoDB是最流行的NoSQL数据库)。

img

1. 什么是NoSQL注入

NoSQL注入是一个漏洞,攻击者能够干扰应用程序对NoSQL数据库进行的查询。NoSQL注入可能使攻击者能够:

  • 绕过身份验证或保护机制。
  • 提取或编辑数据。
  • 导致拒绝服务。
  • 在服务器上执行代码。

2. NoSQL注入的类型

  • 语法注入:当您可以破坏NoSQL查询语法,使您能够注入自己的负载时,就会发生这种情况。该方法与SQL注入中使用的方法类似。然而,由于NoSQL数据库使用一系列查询语言、查询语法类型和不同的数据结构,因此攻击的性质差异很大。
  • 运算符注入:当您可以使用NoSQL查询运算符来操作查询时,就会发生这种情况。

2.1. 语法注入

攻击者可以通过尝试破坏查询语法来检测NoSQL注入漏洞。要做到这一点,请通过提交模糊字符串和特殊字符来系统地测试每个输入,如果应用程序没有对它们进行充分的净化或过滤,这些字符串和字符会触发数据库错误或其他一些可检测的行为。

考虑一个显示不同类别产品的购物应用程序。当用户选择Fizzy饮料类别时,其浏览器会请求以下URL:
https://insecure-website.com/product/lookup?category=fizzy
这导致应用程序发送JSON查询,以从MongoDB数据库中的 product 集合中检索相关产品:
this.category == 'fizzy'

2.1.1. 确定要处理的字符

要确定应用程序将哪些字符解释为语法,可以注入单个字符。例如,您可以提交 ’ ,这将导致以下MongoDB查询:

this.category == '''
如果这导致原始响应发生变化,则这可能表明 ’ 字符破坏了查询语法并导致语法错误。可以通过在输入中提交有效的查询字符串来确认这一点,例如通过转义引号:
this.category == '\''
如果这不会导致语法错误,这可能意味着应用程序容易受到注入攻击。

2.1.2. 确认条件行为

检测到漏洞后,下一步是确定是否可以使用NoSQL语法影响布尔条件。
要测试这一点,请发送两个请求,一个条件为false,一个为true。例如,您可以使用条件语句 ’ && 0 && 'x 和 ’ && 1 && 'x ,如下所示

https://insecure-website.com/product/lookup?category=fizzy'+%26%26+0+%26%26+'x
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+1+%26%26+'x

如果应用程序的行为不同,这表明false条件会影响查询逻辑,而true条件则不会。这表明注入这种语法风格会影响服务器端查询。

2.1.3. 覆盖现有条件

现在您已经确定可以影响布尔条件,可以尝试覆盖现有条件以利用该漏洞。例如,您可以注入一个始终计算为true的JavaScript条件,例如 ‘||1||’ :
https://insecure-website.com/product/lookup?category=fizzy%27%7c%7c%31%7c%7c%27
这将导致以下MongoDB查询:this.category == 'fizzy'||'1'=='1'
由于注入的条件始终为true,因此修改后的查询将返回所有项。这使攻击者能够查看任何类别中的所有产品,包括隐藏或未知类别。

2.2. 运算符注入

NoSQL数据库通常使用查询运算符,这些运算符提供了指定数据必须满足的条件才能包含在查询结果中的方法。MongoDB查询运算符的示例包括:

  • $where:匹配满足JavaScript表达式的文档
  • $ne:匹配所有不等于指定值的值
  • $in:匹配数组中指定的所有值
  • $regex:选择值与指定正则表达式匹配的文档

攻击者可以注入查询运算符来操作NoSQL查询。要做到这一点,请系统地将不同的运算符提交到一系列用户输入中,然后查看错误消息或其他更改的响应。

在JSON消息中,可以将查询运算符作为嵌套对象插入。例如, {"username":"wiener"} 变为 {"username":{"$ne":"invalid"}},对于基于URL的输入,可以通过URL参数插入查询运算符。例如, username=wiener 变为 username[$ne]=invalid 。如果这不起作用,您可以尝试以下操作:

  1. 将请求方法从 GET 转换为 POST
  2. Content-Type 标头更改为 application/json
  3. 将JSON添加到消息正文中
  4. 在JSON中注入查询运算符

3. 漏洞防御

  • 使用接受字符的allowlist对用户输入进行消毒和验证
  • 使用参数化查询插入用户输入,而不是将用户输入直接连接到查询中
  • 为防止操作员插入,应用已接受密钥的允许列表

4. 参考

[1] https://portswigger.net/web-security/nosql-injection

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

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

相关文章

【C++语言】初步认识面向对象编程类和对象(上)

文章目录 前言一.初步认识面向过程和面向对象编程1.面向过程编程初步认识2.面向对象编程初步认识 二.C类1. 类的引入:2. 类的定义3.类的访问限定符&&封装3.1 访问限定符3.2 封装 4.类的实例化5.如何计算类的大小 总结C语言系列学习目录 前言 面向对象编程 类…

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成(Data Integration),简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中,我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中,使其具有相关性并易于使用。 数据集成&#xff1…

今年消费新潮流:零元购商业模式

今天给大家推荐一种极具创新的电子商务模式:零元购商业模式 这个模式支持消费者以零成本或极低成本购买商品。这种模式主要通过返现、积分、优惠券等方式来减少支付金额,使消费者实现“零成本”购物的目标。 人民网在去年发表了一篇文章。 总结了一下&a…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】

基于AFM的物质表面微观结构及力学性质表征仿真实验 说明: 本次实验为本科生《基础物理实验》课程中的虚拟实验部分,在虚拟实验平台中进行。 一、实验目的: 1. 掌握AFM的基本成像原理及系统结构; 2. 掌握AFM的基本操作技巧及操…

使用 Tranformer 进行概率时间序列预测实战

使用 Transformers 进行概率时间序列预测实战 通常,经典方法针对数据集中的每个时间序列单独拟合。然而,当处理大量时间序列时,在所有可用时间序列上训练一个“全局”模型是有益的,这使模型能够从许多不同的来源学习潜在的表示。…

HCIP的学习(9)

OSPF的接口网络类型 ​ OSPF的接口在某种网络类型下的工作方式。 网络类型OSPF接口的工作方式BMABroadcast;可以建立多个邻居关系。需要进行DR选举。hello 10S;dead 40S。P2PP2P;只能建立一个邻居关系,不需要进行DR选举。Hello …

操作系统:进程(二)

进程的状态 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。 一个进程从创建而产生至撤销而消亡的整个生命期间,…

强化学习-Reinforcement learning | RL

目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 什么是强化学习? 强化学习并不是某一种特定的算法,而是…

【好书推荐-第十五期】《 机器学习基础:从入门到求职》(博文视点出品)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号:洲与AI。 🎈 本文专栏:本文收录…

python 重载内置函数吗

python中是不支持函数重载的,但在python3中提供了这么一个装饰器functools.singledispatch,它叫做单分派泛函数,可以通过它来完成python中函数的重载,让同一个函数支持不同的函数类型,它提供的目的也正是为了解决函数重…

Problem #8 [Easy]

This problem was asked by Google. A unival tree (which stands for “universal value”) is a tree where all nodes under it have the same value. Given the root to a binary tree, count the number of unival subtrees. For example, the following tree has 5 un…

osg渲染过程

目录 1、渲染最简单代码 2、详解run方法 3、详细过程 4、回调函数 5、Node Visitor 1、渲染最简单代码 2、详解run方法 3、详细过程 3.1 advance()方法 进行帧计数 3.2 eventTraversal() eventTraversal()响应用户操作,eventTraversal()遍历的是事件队列,而…

小型时间继电器ST3PA-C DC24V 带插座PF085A 导轨安装 JOSEF约瑟

ST3P系列时间继电器 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3) 5s DC24V ST3PC-1(AH3-3) 2h AC220V ST3PC-F(JSZ3C-F) AC380V ST3PA-E(JSZ3A-E) DC24V ST3PA-F(JSZ3A-F) DC24V ST3PF(JSZ3F) 10s AC36V ST3PC-1(AH3-3) 10s AC24V ST3PC-1…

OpenHarmony开发实例:【分布式游戏鉴权应用】

1.介绍 本文将介绍分布式游戏鉴权应用。操作过程为: 设备A点击“开始游戏”按钮,开始搜索周边设备。 设备A显示周边设备,点击设备B并发起连接请求,远程拉起设备B的FA。 设备B收到请求后,选择是否允许“开启游戏”。…

git am XXX.patch 文件内容解析

git am XXX.patch 文件内容解析 打补丁的两种方式: 1.patch XXX.patch 2.git am XXX.patch 例如: diff --git a/drivers/crypto/se/ce.c b/drivers/crypto/se/ce.c index e6f68286d4ce6..de1bcb46fbe6b 100644 --- a/drivers/crypto/se/ce.cb/drive…

【生产案例面试题】JVM调优

写作目的 最近上线了一个需求,遇到了一个JVM报警的问题,很荣幸能遇到,在此分享一下整个调优的过程。 背景 我们是中台服务,我们的甲方就是上游不同的业务。中台原则上是业务和能力分离,但是不可避免的是分不开&…

【示例】MySQL-SQL语句优化

前言 本文主要讲述不同SQL语句的优化策略。 SQL | DML语句 insert语句 插入数据的时候,改为批量插入 插入数据的时候,按照主键顺序插入 大批量插入数据的时候(百万),用load指令,从本地文件载入&#x…

Web地图服务规范之栅格瓦片地图服务:WMTS(WebMapTileService,网络地图瓦片服务)、TMS(TileMapService,瓦片地图服务)和XYZ

一、什么是栅格瓦片地图服务 这四种地图服务都是通过网络传输的栅格瓦片地图服务,这里有三个名词需要解释: 1、什么是栅格? 遥感影像、Dem等,就是图片。 2、什么是地图服务? 实际上,地图服务就是一个u…

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中,经常遇到请求需要用到token的时候,我们可以把返回token的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token变量值,所以必须要生…

windows ubuntu子系统,单细胞篇 1.cellranger安装与分析

这几天,我将单细胞测序在windows ubuntu子系统中跑了一遍,将过程分享給大家。 单细胞测序conda create -n 10xdb #创建环境 conda activate 10xdbconda install -c bioconda cellranger -y #失败,可能源中没有 wget -O cellranger-7.…