zoukankan      html  css  js  c++  java
  • MongoDB+php7搭建

    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 MongoDBDriverManager("mongodb://localhost:27017");  
    
    //设置过滤规则,有点类似mysql的where
    $filter = [];
    //设置操作
    $options = [];
    //生成查询对象
    $query = new MongoDBDriverQuery($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 MongoDBDriverManager("mongodb://localhost:27017");
    
    $filter = ['name' => $name];
    $options = [];
    
    $query = new MongoDBDriverQuery($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/

  • 相关阅读:
    HTML 图片文字滚动
    Request.QueryString的用法
    细线表格的制作
    photoshop的小小快捷键
    制作首页
    css
    编写BLL层
    完成新闻表操作类
    编写剩下的存储过程
    重构SQLHelper2
  • 原文地址:https://www.cnblogs.com/sijidou/p/10600840.html
Copyright © 2011-2022 走看看