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 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章