【漏洞修复】MongoDB未授权访问漏洞复现和修复
0X01漏洞描述
MongoDB服务安装后,默认未开启权限验证。如果服务监听在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参数启动后,无账号则本地和远程均无任何数据库访问权限。
0X02 漏洞危害
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增删改高危动作)而且可以远程访问数据库。
0X03 漏洞验证
1、 nmap验证漏洞
nmap -p 27017 --script mongodb-info <ip>
2、 msf验证漏洞
0X04 修复建议
1、 MongoDB只需在本地使用,建议只在本地开启监听服务,使用--bind_ip 127.0.0.1绑定监听地址
mongod --bind_ip 127.0.0.1 --dbpath /tmp/test
或:在配置文件中指定监听IP,Linux下默认配置文件为/etc/mongod.conf。
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
2、 策略仅允许指定的IP来访问MongoDB
iptables -A INPUT -s -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
3、 启动基于角色的登录认证功能
MongoDB 3.0及以上版本启动时添加--auth参数开启认证访问,此时若数据库中无账号,本地登录则无权限进行任何操作,因此需要先以无认证的方式启动服务并创建系统用户管理员账号。
1)以无访问认证的方式启动MongoDB
$ mongod --dbpath /data/db
2)未开启认证的环境下,登录到数据库
$ mongo --host 127.0.0.1 --port 27017
ongoDB shell version v4.0.8
connecting to: mongodb://127.0.0.1:27017/test?gssapiServiceName=mongodb
3)创建系统用户管理员创建一个用户名为myUserAdmin,密码为Passw0rd的系统用户管理员账号。
#切换到admin库:
> use admin
switched to db admin
#创建用户
> db.createUser(
{
user: "myUserAdmin",
pwd: "Passw0rd",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
#创建成功后提示信息:
Successfully added user: {
"user" : "myUserAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
说明:3.0之前版本使用db.addUser方法创建用户。
4)重启MongoDB服务,开启访问认证启动时添加--auth参数
$ mongod --auth --port 27017 --dbpath /tmp/test
或:在配置文件中添加以下内容,指定配置文件启动服务:
#security:
security:
authorization: enabled
指定配置文件启动MongoDB
$ mongod --config /etc/mongod.conf
5)使用系统用户管理员账号登录
$ mongo --port 27017 -u "myUserAdmin" -p "Passw0rd" --authenticationDatabase "admin"
也可以在连接MongoDB是不指定认证信息,连接成功后通过db.auth()方法进行认证:
> use admin
switched to db admin
> db.auth("myUserAdmin","Passw0rd")
1 #返回1,表示认证成功
6)创建数据库用户创建完系统用户管理员账号并通过系统用户管理员登陆后,对每个库创建指定的用户。下面以对products库创建一个具有读写权限的用户accountUser为例:
> use products
> db.createUser(
{
user: "accountUser",
pwd: "password",
roles: [ "readWrite", "dbAdmin" ]
}
)
#用户创建成功
Successfully added user: { "user" : "accountUser", "roles" : [ "readWrite", "dbAdmin" ] }
7)使用数据库用户访问指定库
$ mongo --port 27017 -u "accountUser" -p "password" --authenticationDatabase "products"
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- r语言空间可视化绘制道路交通安全事故地图
- 小知识:Oracle RAC添加服务名实现单节点访问
- Python去掉图片四周纯色边框
- R语言空间可视化:绘制英国脱欧投票地图
- CC攻击防御的一种方法
- 机器学习笔记之梯度下降算法原理讲解
- 使用OpenCV在Python中进行图像处理
- R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化生成GIF动画
- Shiny-R语言轻松开发交互式web应用
- SPSS中的等级线性模型Multilevel linear models研究整容手术数据
- Python花式表白
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- WordPress运行内存不足的解决方式
- ggplot2 |legend参数设置,图形精雕细琢
- miRBase物种名缩写