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