【漏洞修复】MongoDB未授权访问漏洞复现和修复

时间:2022-07-28
本文章向大家介绍【漏洞修复】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"