时间:2021-07-01 10:21:17 帮助过:21人阅读
查看集合
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/
MongoDB+php7搭建
标签:image 格式 tail show rest ODB insert int xen