「 典型安全漏洞系列 」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语言系列学习目录 前言 面向对象编程 类…

linux服务器配置conda和torch环境踩坑记录

anaconda环境安装torch时候报错 CondaValueError: Malformed version string ~: invalid character(s) 网上所有方法都试过,包括重新设置.condarc文件,换清华源 尝试更新conda conda update -n base conda,无法更新,还是报错上面的错 推测是版本过低导致 conda --version ,结…

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

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

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

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

设计模式学习笔记(知识点与代码实践)

文章目录 0 背景1 设计模式 0 背景 设计模式其实很早就想学习了,但是由于懒 ,所以一直拖到现在。之前写项目也接触过一些零散的设计模型,却一直没有系统的学习过,这次就是系统的学习这方面的知识。 本文就是学习心得和代码实践的…

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

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

stable diffusion本地部署教程

Stable Diffusion是一种生成模型,用于根据给定的文本输入生成图像。要在本地部署Stable Diffusion,您需要完成以下步骤: 安装依赖项 首先,确保您的计算机上已安装了Python(推荐使用3.8或更高版本)和pip。然…

EDA重新成为热点,中国正在成为参与者

EDA正在从一个沉淀已久的领域转变为一个热门的市场,这得益于市场中对定制设计的呼声,以及人工智能等先进技术的推出,这些工具将需要开发具有更高性能的芯片架构。 因为市场更需要定制芯片,这意味着更多的芯片设计工作正在发生&…

Semaphore

Semaphore 翻译: 信号量 解释: 信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。 例如,这是一个使用信号量来控制对一个项目池的访问的类 用法 可以限制线程的使用次数 public static vo…

使用 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中函数的重载,让同一个函数支持不同的函数类型,它提供的目的也正是为了解决函数重…

CV最新论文|4月10日 arXiv更新论文合集

以下内容由马拉AI整理,今天为大家带来4月10日 arXiv 计算机视觉和模式识别相关论文: 1、InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD InternLM-XComposer2-4KHD:一…

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()遍历的是事件队列,而…

Python knn算法

KNN(K-Nearest Neighbors)算法,即K最近邻算法,是一种基本且广泛使用的分类和回归方法。在分类问题中,KNN通过查找一个样本点的K个最近邻居,然后根据这些邻居的类别通过多数投票或加权投票来预测该样本点的类…

小型时间继电器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…