0x00前言:

今天一位非计算机专业的朋友问我怎么打开.bson文件,我第一反应.bson文件是什么,网上查了下是mongodb的传输文件。也就是类似于mysql的.sql文件一样

之前看过mongodb的注入,但是没有亲自实践,这次一并从环境搭建开始学习了波mongodb

0x01 mongodb是什么:

mongodb和mysql等数据库管理软件作用一样,就是用来存放数据的

mongodb与mysql,mssql等数据库不同在于,它不是关系数据库,而是一种集合中包含键值对形式存放数据的管理软件

关系数据库结构一般是:库,表,字段,每一行数据是个组元

非关系数据库以这里的mongodb为例结构是:库,集合,键值对

0x02 搭建mongodb+php:

我搭建的环境是ubuntu 16.04,事先已经装好了php+apache2+mysql

那么要搭建mongodb和php之间通信,可以简单来概括为两步:安装mongodb,配置php的mongodb模块

安装mongodb

apt-get install mongodb

安装好可以直接在本地连接

这里简单说下基础操作语句

查询数据库

show dbs;

进入数据库(如果目标不存在,就是创建个新的数据库,但是要写入才能show得出来)

use sijidou;            //创建库
db.createCollection('siji');  //创建集合

查看集合

show collections;

给某个集合内添加数据,插入的语句类似于json的格式

db.siji.insert({id:1,name:'sijidou',age:'18'})

查看某个集合的内容

db.siji.find()

安装php-mongodb模块

apt-get install php-mongodb

重启apache,在phpinfo中就可以看到mongodb模块的信息了(刚装好可能下面的信息不一样,但是有这一个大栏就行)

php7与php其他版本运行mongodb的方式不同,php5的格式可以参照

http://www.runoob.com/mongodb/mongodb-php.html

但是安装的步骤可能和我上面讲的不同

php7的格式为,这里以最简单的查询语句为例

<?php
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

//设置过滤规则,有点类似mysql的where
$filter = [];
//设置操作
$options = [];
//生成查询对象
$query = new MongoDB\Driver\Query($filter, $options);
//对相应的 sijidou库 的siji集合 进行查询
$cursor = $manager->executeQuery('sijidou.siji', $query); foreach($cursor as $result){
  print_r($result);   
  echo "<br>";
}
?>

但是运行的时候可能会出现以下问题

php7 erver at localhost:27017 reports wire version 2, but this version of libmongoc requires at least 3 (MongoDB 3.0)

这个原因是mongodb的版本是2,但是php要求至少要3以上的

遇到这个问题升级mongodb数据库,步骤如下

导入包管理系统所需要的key

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

为mongodb创建个apt-get的列表

echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

更新本地包

sudo apt-get update

升级安装

sudo apt-get install -y mongodb-org

但是在这种情况下又会遇到,服务启动不了的情况

Failed to start mongodb.service: Unit mongodb.service is masked.

依次执行以下步骤

sudo rm /var/lib/mongodb/mongod.lock
sudo mongod --repair --dbpath /var/lib/mongodb
sudo mongod --fork --logpath /var/lib/mongodb/mongodb.log --dbpath /var/lib/mongodb
sudo service mongodb start

环境差不多就搭建完成了,接下来添加几组数据并测试一下

如果要导入.bson文件的话

mongorestore -d 库名 文件路径
mongorestore -d csh ./articles.bson

0x03 MongoDB注入?

首先修改下源码,并模拟添加个flag集合

<?php
$name = $_GET['name'];
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $filter = ['name' => $name];
$options = []; $query = new MongoDB\Driver\Query($filter, $options);
$result = $manager->executeQuery('sijidou.siji' ,$query); foreach($result as $ans){
print_r($ans);
} ?>

这里的filter的内容表示 name =$name的值,效果如下

然后我们可以用name[$ne]=sijidou显示不是sijidou的值

其他的方法:

$gt   -- '>'
$lt -- '<'
$ne -- '!='
$eq -- '='
$gte -- '>='
$lte -- '<='

但是看了网上的mongodb注入方式,发现没有php7的,都是php5

php5的查询语句可以是这样的

$query = "var data = db.sijidou.findOne({name:'$username'});return data;";
//调用
$mongo = new mongoclient();
$db = $mongo->sijidou;
$data = $db->execute($query);

$query的内容是整个js代码字符串,那么就可以操作了

比如 username的内容为

sijidou'}); return version();var data2 = db.sijidou.findOne({name:'sijidou

拼接后,执行了3条语句,其中version()就是目标值

var data = db.sijidou.findOne({name:'sijidou'}); return version();var data2 = db.sijidou.findOne({name:'sijidou'});return data;

防御方法:addslashes()转义

但是但是但是!!!

这个在php5中查询MongoDB和mysql一样是整句语句,而php7是用filter和options,所以没法这么注入,我也没找到啥好的方法

至于php7中的,name[$ne]=sijidou,这种返回其他的值的情况,可以使用下面方法避免

name[$ne]=sijidou,不会返回结果了

因此这个小测试也拿不到flag

0xFF 结语

总得来说,php7比php5使用MongoDB更加麻烦一点,但是更加安全

参考链接

https://blog.csdn.net/jws2011520/article/details/78157778

https://www.centos.bz/2017/11/mongodb%E4%B8%A4%E4%B8%AA%E6%8A%A5%E9%94%99%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95/

https://www.cnblogs.com/mrchang/p/6255226.html

https://cl0und.github.io/2018/01/12/MONGODB%E6%B3%A8%E5%85%A5%E5%AD%A6%E4%B9%A0/

MongoDB+php7搭建的更多相关文章

  1. Mongodb - 切片搭建

    0.概述 mongodb分片搭建,版本号4.0.2,以下除了创建opt文件夹以外,所有操作均在mongodb用户下面执行 准备三台机器:192.168.56.81192.168.56.82192.16 ...

  2. 《OD大数据实战》MongoDB环境搭建

    一.MongonDB环境搭建 1. 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 2. 解压 tar -zxvf ...

  3. 【MongoDB】MongoDB服务器搭建(Unix/Linux)

    1.安装MongboDB安装包(开源免费的哟) 在Mac 下 brew install mongoDB 就可以啦 安装要等一会儿,大概200M 2. cd到MongboDB文件夹 - 如果是用home ...

  4. MongoDB——环境搭建

    项目中需要将一些读多改少的数据存入到 MongoDB 数据库中来提高效率,于是简单学习一些MongoDB数据库的知识,来进行应对,也是对自己知识盲区进行补充.本文主要学习介绍MongoDB数据库在Li ...

  5. MongoDB:搭建三节点 Replica Set 环境

    今天学习了搭建 MongDB 复制环境,实验环境是在虚拟机上同一系统,并搭建三节点 Replica Set,根据文档上的描述,mongodb 复制配置简单,并且能够自动 failover,这些高级特性 ...

  6. mongodb主从搭建

    #tigergao 官网进行下包,可以下载源码包或者二进制包,本次下载的为二进制包,进行试验. 主服务器搭建: mkdir mongomaster cp mongodb-linux-x86_64-rh ...

  7. MongoDB环境搭建

    MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...

  8. NoSql数据库初探-mongoDB环境搭建

    NoSQL数据库一改关系型数据库的缺点,更容易的集成.分布式.无模式.故障恢复等特点,正在一步步餐食关系型数据库的市场,作为一个与时俱进的码农了解一下新技术是必须的,尤其是在读了<NoSql精粹 ...

  9. Windows下MongoDB环境搭建

    MongoDB下载 登录MongoDB官网:www.mongodb.org:点击[Download MongoDB]按钮,进入如下所示界面 选择目标操作系统及其版本,比如这里选择的是64位的Windo ...

随机推荐

  1. NIO(一)

    1.NIO是什么? 是JDK1.4之后推出的一个新的IO操作(netty.mina通讯框架的底层都是NIO实现的连接) 2.NIO和IO的区别(阻塞只会出现在网络通讯中,都是同步) NIO:非阻塞类型 ...

  2. java多线程快速入门(二十)

    1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...

  3. 浅谈FastJson的TypeReference用法

    简单描述:看同事提交的代码,发现有一行代码 似曾相识,但却朦朦胧胧,ε=(´ο`*)))唉很明显自己没掌握呗,于是乎,就百度了一下 干货:对进行泛型的反序列化,使用TypeReference可以明确的 ...

  4. java子类继承关系

    1.java的类按照继承关系的树形结构所有的类其根节点都是object类,一个类有两种重要的成员,一是变量 .二是方法.子类继承不能继承父类中被声明为private的变量和方法. public cla ...

  5. 纯CSS3超酷3D旋转立方体动画特效

    简要教程 这是一款神奇的纯 CSS3 立方体动画特效插件.使用CSS3来制作动画效果已经成为WEB前端开发的一种时尚,从简单的颜色和尺寸动画,到复杂的旋转.翻转动画, CSS3 展现了它无穷的魅力.使 ...

  6. 通过awk 和 sed 将多余的列剔除

    通过awk 和 sed 将多余的列剔除 名词注释: awk -F 指定分隔符 OFS 指定输出分隔符 sed sed "s/|/test/2" a.log 将第二个 | 线替换为 ...

  7. RabbitMq相关运维

    # 命令查询所有用户列表rabbitmqctl list_users # 使用命令对 xiandian-admin 用户进行授权set_permissions xiandian-admin '.*' ...

  8. Elasticsearch集群

    详细Elasticsearch安装: https://www.cnblogs.com/littlehb/p/8406378.html 安装之前需先优化内核: https://www.cnblogs.c ...

  9. Doracle.jdbc.J2EE13Compliant=true

    To make the Oracle driver behave in a Java EE-compliant manner, you must define the following JVM pr ...

  10. PyTorch中的backward [转]

    转自:https://sherlockliao.github.io/2017/07/10/backward/ backward只能被应用在一个标量上,也就是一个一维tensor,或者传入跟变量相关的梯 ...