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