MongoDB+php7搭建

0x00前言:php

今天一位非計算機專業的朋友問我怎麼打開.bson文件,我第一反應.bson文件是什麼,網上查了下是mongodb的傳輸文件。也就是相似於mysql的.sql文件同樣html

以前看過mongodb的注入,可是沒有親自實踐,此次一併從環境搭建開始學習了波mongodbmysql

 

0x01 mongodb是什麼:git

mongodb和mysql等數據庫管理軟件做用同樣,就是用來存放數據的github

mongodb與mysql,mssql等數據庫不一樣在於,它不是關係數據庫,而是一種集合中包含鍵值對形式存放數據的管理軟件sql

關係數據庫結構通常是:庫,表,字段,每一行數據是個組元mongodb

非關係數據庫以這裏的mongodb爲例結構是:庫,集合,鍵值對數據庫

 

0x02 搭建mongodb+php:apache

我搭建的環境是ubuntu 16.04,事先已經裝好了php+apache2+mysqljson

那麼要搭建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/

http://www.javashuo.com/article/p-mannzlyz-bx.html

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

相關文章
相關標籤/搜索