热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mongodbcond模糊查询_NoSQL注入之MongoDB

01背景NoSQL,指的是非关系型的数据库。NoSQL有时也称作NotOnlySQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQ

93a9799aeed99a1d906e63a659902cbe.png

01 背景

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL(不仅仅是 SQL)是数据存储的一个流行趋势;它泛指依赖于不同存储机制的非关系型数据库,这些存储机制包括文档存储、键值对存储和图。

这些数据库的广泛应用是由现代大型应用推动起来的,比如 Facebook、Amazon 和 Twitter,它们需要把数据分布到许多的服务器上。

传统关系型数据库不满足这种扩展性需求,它们需要一个单独的数据库节点去执行同一事务的所有操作。在本文中,我们将分析 NoSQL 的威胁和技术

02 基础知识

Web 应用和服务通常使用 NoSQL 数据库去保存客户数据。

在MongoDB的FAQ里面有这样一段话:

"..with MongoDB we are not building queries from string , so traditional SQL injection attacks are not a problem."

意思是:使用MongoDB,我们不从字符串生成查询,因此传统的SQL注入攻击对此无效(老王自己翻译)

因此大多数的开发者以为这样就高枕无忧了。其实他们的说法并无错误。

传统的SQLi手段是不可行的。因为MongoDB所要求的输入形式是json的格式,

例如:find({'key1';'value1'})在实际的使用中(PHP环境下),一般是这样使用$collection->find(array('key'=> 'value'));对于习惯传统的SQL注入手段的我们来讲,这样的形式很难想到常规的方法去bypass也很难想到办法去构造payload,这种手段就像参数化的SQL语句一样很难注入。

想要找到真的漏洞成因和原理,了解最基础的MongoDB语法是必要的,下面做简略介绍:

条件操作符

$gt : >

$lt : <

$gte: >&#61;

$lte: <&#61;

$ne : !&#61;、<>

$in : in

$nin: not in

$all: all

$or:or

$not: 反匹配(1.3.3及以上版本)

模糊查询用正则式&#xff1a;db.customer.find({&#39;name&#39;: {&#39;$regex&#39;:&#39;.*s.*&#39;} })

/**

* : 范围查询 { "age" : { "$gte" : 2 , "$lte" : 21}}

* : $ne { "age" : { "$ne" : 23}}

* : $lt { "age" : { "$lt" : 23}}

*/

03  NoSQL攻击途径

Web应用和服务通常使用NoSQL数据库去保存客户数据。

下图展示了一个典型的架构,在此NoSQL用于保存通过Web应用来存取的数据。通过一个驱动程序来进行这个数据库的访问,即一个存取协议包装器,它为多种编程语言编写的数据库客户端提供类库。

尽管该驱动程序自身可能不易受到攻击,但有时它们提供了不安全的API,当应用开发人员错误地使用它们时,就会给该应用引入漏洞了,这些漏洞会被人利用对数据库进行任意操作。

如图所示,攻击者可以伪造一个带有注入代码的Web访问请求,当数据库客户端或协议包装器进行处理时,将会执行预期的非法数据库操作。

ecb97038c07db6343b8b9124a871d653.png

图中典型Web应用架构。NoSQL用于保存通过Web应用来存取的数据。通过一个驱动程序来进行这个数据库的访问,即一个存取协议包装器,它为多种编程语言编写的数据库客户端提供类库。

尽管该驱动程序自身可能不易受到攻击,但有时它们提供了不安全的API,当应用开发人员错误地使用它们时,就会给该应用引入漏洞了。NoSQL相关的SQL攻击主要机制可以大致分为以下五类&#xff1a;

· 1.重言式。又称为永真式。此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制。例如,在本文中,我们将展示攻击者如何用$ne操作(不相等)的语法让他们无需相应的凭证即可非法进入系统。

· 2.联合查询。联合查询是一种众所周知的SQL注入技术,攻击者利用一个脆弱的参数去改变给定查询返回的数据集。联合查询最常用的用法是绕过认证页面获取数据。在本文中,我们将展示一个攻击示例,它将通过增加永真的表达式利用布尔OR运算符进行攻击,从而导致整个语句判定出错,进行非法的数据获取。

· 3.Javascript注入。这是一种新的漏洞,由允许执行数据内容中Javascript的NoSQL数据库引入的。Javascript使在数据引擎进行复杂事务和查询成为可能。传递不干净的用户输入到这些查询中可以注入任意Javascript代码,这会导致非法的数据获取或篡改。

· 4.背负式查询。在背负式查询中,攻击者通过利用转义特定字符(比如像回车和换行之类的结束符)插入由数据库额外执行的查询,这样就可以执行任意代码了。

· 5.跨域违规。HTTP REST APIs是NoSQL数据库中的一个流行模块,然而,它们引入了一类新的漏洞,它甚至能让攻击者从其他域攻击数据库。在跨域攻击中,攻击者利用合法用户和他们的网页浏览器执行有害的操作。在本文中,我们将展示此类跨站请求伪造(CSRF)攻击形式的违规行为,在此网站信任的用户浏览器将被利用在NoSQL数据库上执行非法操作。通过把HTML格式的代码注入到有漏洞的网站或者欺骗用户进入到攻击者自己的网站上,攻击者可以在目标数据库上执行post动作,从而破坏数据库。

04  威胁

举出几个例子&#xff1a;

//查询age &#61; 22的记录db.userInfo.find({"age": 22});//相当于&#xff1a;select * from userInfo where age &#61; 22;//查询age > 22的记录db.userInfo.find({age: {$gt: 22}});//相当于&#xff1a;select * from userInfo where age > 22;

我们发现&#xff0c;在find的参数里&#xff0c;age对应的value设置为数组(这个数组包含特殊的mongoDB特别定义的变量名作为操作符&#xff0c;变量名对应的value作为操作对象)将会起到条件查询的作用。

就PHP本身的性质而言&#xff0c;由于其松散的数组特性&#xff0c;导致如果我们输入value&#61;A那么&#xff0c;也就是输入了一个value的值为1的数据。如果输入value[ne&#61;>2),在MongoDB的角度来&#xff0c;很有可能从原来的一个单个目标的查询变成了条件查询($ne表示不等于-not equel)&#xff1a;

从xxx.find({&#39;key&#39;: &#39;A&#39;})变成了xxx.find({&#39;key&#39;:{$ne:&#39;A&#39;}})

显然这样已经出现了非常严重的安全问题。

JSON查询以及数据格式

尽管相对安全,但流行的JSON表述格式仍可受到新类型的注入攻击。我们将举例说明MongoDB中的此类攻击,MongoDB是一个面向文档的数据库,已经有多个大型供应商予以采用,其中包括eBay、Foursquare和LinkedIn。在MongoDB中,查询和数据以JSON格式描述,这在安全方面要优于SQL,因为它是更充分定义的,容易进行加密和解密,而且在每种编程语言中都有不错的原生实现。像SQL注入那样对查询结构的破坏,在JSON结构的查询中会更难实现。在MongoDB中常见的插入语句应该是这样的&#xff1a;

db.books.insert({ title: &#39;The Hobbit&#39;, author: &#39;J.R.R. Tolkien&#39; })

这会插入一个新的文档到books的集合中,它具有title(标题)和author(作者)字段。常见的查询条件应该是这样的&#xff1a;

db.books.find({ title: &#39;The Hobbit&#39; })

除限制要查询的字段之外,查询中还可以包括正则表达式和条件。

PHP重言式注入

让我们审视一下图中所画的架构,一个使用PHP实现后端的Web应用,它将用于查询数据存储的请求编码为JSON格式。让我们使用一个MongoDB示例去演示数组注入漏洞吧,从技术和结果上来看这是一个与SQL注入有些类似的攻击手段。

f93b2a68455bc49254482250b1020a57.png

图中使用MongoDB的PHP应用。一个使用PHP实现后端的Web应用,它把用于查询数据存储的请求编码为JSON格式。PHP编码数组为原生JSON。嗯,数组示例如下&#xff1a;

array(&#39;title&#39; &#61;> &#39;The Hobbit&#39;, &#39;author&#39; &#61;> &#39;J.R.R. Tolkien&#39;);

将由PHP编码为以下JSON格式&#xff1a;

{"title": "The Hobbit", "author": "J.R.R. Tolkien"}

如果一个PHP具有登录机制,由用户浏览器通过HTTP POST(它像HTTP GET一样容易受到攻击)发送过来用户和密码,常见的POST URL编码应该是这样的&#xff1a;

username&#61;Tolkien&password&#61;hobbit

后端PHP代码针对该用户对它进行处理并查询MongoDB,如下所示&#xff1a;

db->logins->find(array("username"&#61;>$_   POST["username"],   "password"&#61;>$_POST["password"]));

这本身合情合理没什么问题,直觉上开发人员可能喜欢用以下查询&#xff1a;

db.logins.find({ username: &#39;tolkien&#39;, password: &#39;hobbit&#39;})

然而,PHP针对关联数组有个内置的机制,这让攻击者有机可乘,可发送以下恶意的数据&#xff1a;

username[$ne]&#61;1&password[$ne]&#61;1

PHP会把该输入解析为&#xff1a;

array("username" &#61;> array("$[ne] " &#61;>   1), "password" &#61;>   array("$ne" &#61;> 1));,

它会编码为如下MongoDB查询&#xff1a;

db.logins.find({ username: {$ne:1 },   password {$ne: 1 })

因为$ne是MongoDB用来判定条件是否不相等的,所以它会查询登录集合中的所有用户名称不等于1且密码也不等于1的记录。因此,本次查询将返回登录集合中的所有用户。换成SQL的表述法,就等同于以下查询语句&#xff1a;

SELECT * FROM logins WHERE username <>   1 AND password <> 1

在这种情况下,漏洞就为攻击者提供了一个不必有效凭证即可登录应用的方式。在其他变体中,该漏洞可能会导致非法数据访问或由无特权的用户执行特权操作。为缓解这个问题,我们需要转换从需求中接收的参数为适当类型,在本例中,可使用字符串,如下所示&#xff1a;

db->logins->find(  array("username"&#61;>(string)$_    POST["username"],  "password"&#61;>(string)$_    POST["password"])); 

------------END--------------

加小唐老师微信领取

500元专属课程优惠券

&#43;

 领取最新技术资料和面试题

92b411b1b2d175fcf81e9ed0cfdb0602.png

你可能还想看软件测试到底在学什么(职业发展概览)面试中的工具问题 看这一篇就够了面试官&#xff1a;请你说说微信发红包&#xff0c;有哪些测试点MySQL学习笔记1-关系数据库概述

ee0e6669ae7c4352e1a7e075ab42c822.png




推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • OAuth2.0指南
    引言OAuth2.0是一种应用之间彼此访问数据的开源授权协议。比如,一个游戏应用可以访问Facebook的用户数据,或者一个基于地理的应用可以访问Foursquare的用户数据等。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • http头_http头部注入
    1、http头部注入分析1、原理 ... [详细]
author-avatar
ahao123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有