利用SQLMAP获取os-shell的过程分析「UDF提权」
字数 1897 2025-08-25 22:58:40

SQLMAP获取os-shell过程分析:UDF提权技术详解

一、前置知识

1. MySQL文件操作限制条件

MySQL读写文件有两个主要限制条件:

  1. 用户权限限制

    • MySQL服务默认以mysql用户权限启动
    • 没有危险目录的写入权限,如:
      • /usr/lib64/mysql/plugin (root 755)
      • /var/www/html (root 755)
      • /var/spool/cron (root 700)
      • /root/.ssh (root 700)
  2. secure_file_priv参数限制

    • MySQL 5.6.34+版本默认值为NULL或指定目录(如/var/lib/mysql-files)
    • 禁止在危险目录写入

2. 权限概念区分

  • System root:操作系统root用户
  • System mysql:操作系统mysql用户
  • MySQL root:MySQL数据库root用户
  • MySQL user:MySQL普通用户

二、环境准备

1. 默认测试环境

  • 操作系统:CentOS 7.7.1908
  • 数据库:MySQL 5.7.29
    • 参数:--secure-file-priv=/var/lib/mysql-files
  • 工具:SQLMAP 1.4.2

2. 关键参数说明

  • -d DIRECT:直接数据库连接字符串
  • --os-shell:获取交互式操作系统shell

三、UDF提权获取System Shell

1. 常规情况下的失败

当MySQL以mysql用户启动时,尝试获取os-shell会失败:

sqlmap -d "mysql://root:`echo $pass`@172.16.58.130:3306/mysql" --os-shell --no-cast

错误提示:

[WARNING] it looks like the file has not been written (usually occurs if the DBMS process user has no write privileges in the destination path)
[ERROR] there has been a problem uploading the shared library

2. 成功条件配置

要使UDF提权成功,需要满足:

  1. 以root用户启动MySQL服务

    mysqld --user=root --secure_file_priv=''
    
  2. 修改secure_file_priv参数

    • 在/etc/my.cnf的[mysqld]段添加:
      user=root
      secure_file_priv=''
      
    • 重启MySQL服务

3. 检查secure_file_priv值

show global variables LIKE "secure_file_priv";

4. 成功获取shell

配置完成后执行:

sqlmap -d "mysql://root:`echo $pass`@172.16.58.130:3306/mysql" --os-shell --no-cast

成功流程:

  1. 建立MySQL连接
  2. 检测数据库架构(32位/64位)
  3. 获取插件目录绝对路径
  4. 上传UDF共享库文件
  5. 创建UDF函数(sys_exec和sys_eval)
  6. 获取交互式shell

5. 技术原理分析

  1. UDF文件上传

    • 本地文件:/tmp/sqlmap.../lib_mysqludf_sys...so
    • 远程路径:/usr/lib64/mysql/plugin/libscwmi.so
  2. UDF函数创建

    CREATE FUNCTION sys_exec RETURNS string SONAME 'libscwmi.so';
    CREATE FUNCTION sys_eval RETURNS string SONAME 'libscwmi.so';
    
  3. 命令执行

    • 通过UDF函数执行系统命令
    • 获取命令输出

6. 清理过程

退出时SQLMAP会:

  1. 删除UDF函数(sys_exec和sys_eval)
  2. 提示需要手动删除UDF共享库文件

四、常规注入获取Webshell

1. 基本流程

  1. 利用SELECT ... INTO OUTFILE ... LINES TERMINATED BY上传小马
  2. 通过小马上传完整Webshell
  3. 使用Webshell执行命令(参数如cmd=whoami)

2. Webshell功能

Webshell可能使用的PHP函数:

  • system()
  • proc_open()
  • shell_exec()
  • passthru()
  • popen()
  • exec()

五、防御建议

  1. 不要以root用户运行MySQL

    • 官方明确警告此操作极其危险
    • 任何有FILE权限的用户都能以root身份创建文件
  2. 合理配置secure_file_priv

    • 限制文件操作目录
    • 需要修改配置文件并重启服务生效
  3. 目录权限控制

    • 避免给web目录(如/var/www/html)777权限
    • 严格控制插件目录权限

六、技术总结

  1. UDF提权关键点

    • MySQL服务运行用户权限
    • secure_file_priv参数配置
    • 插件目录可写权限
  2. 两种os-shell区别

    • UDF提权:获取System Shell(系统级权限)
    • 常规注入:获取Webshell(受限于Web服务器权限)
  3. 实际利用条件

    • 需要MySQL高权限账户
    • 需要能够修改MySQL服务配置
    • 或系统管理员配置不当(如目录777权限)

七、参考资源

  1. MySQL官方安全建议:

    • Never run the MySQL server as the Unix root user
  2. secure_file_priv参数文档:

    • server-system-variables
  3. SQLMAP支持的UDF:

    • 内置MySQL和PostgreSQL的UDF so文件
  4. 抓包分析:

    • 可参考附件中的Pcap示例
SQLMAP获取os-shell过程分析:UDF提权技术详解 一、前置知识 1. MySQL文件操作限制条件 MySQL读写文件有两个主要限制条件: 用户权限限制 : MySQL服务默认以mysql用户权限启动 没有危险目录的写入权限,如: /usr/lib64/mysql/plugin (root 755) /var/www/html (root 755) /var/spool/cron (root 700) /root/.ssh (root 700) secure_ file_ priv参数限制 : MySQL 5.6.34+版本默认值为NULL或指定目录(如/var/lib/mysql-files) 禁止在危险目录写入 2. 权限概念区分 System root :操作系统root用户 System mysql :操作系统mysql用户 MySQL root :MySQL数据库root用户 MySQL user :MySQL普通用户 二、环境准备 1. 默认测试环境 操作系统:CentOS 7.7.1908 数据库:MySQL 5.7.29 参数:--secure-file-priv=/var/lib/mysql-files 工具:SQLMAP 1.4.2 2. 关键参数说明 -d DIRECT :直接数据库连接字符串 --os-shell :获取交互式操作系统shell 三、UDF提权获取System Shell 1. 常规情况下的失败 当MySQL以mysql用户启动时,尝试获取os-shell会失败: 错误提示: 2. 成功条件配置 要使UDF提权成功,需要满足: 以root用户启动MySQL服务 : 修改secure_ file_ priv参数 : 在/etc/my.cnf的[ mysqld ]段添加: 重启MySQL服务 3. 检查secure_ file_ priv值 4. 成功获取shell 配置完成后执行: 成功流程: 建立MySQL连接 检测数据库架构(32位/64位) 获取插件目录绝对路径 上传UDF共享库文件 创建UDF函数(sys_ exec和sys_ eval) 获取交互式shell 5. 技术原理分析 UDF文件上传 : 本地文件: /tmp/sqlmap.../lib_mysqludf_sys...so 远程路径: /usr/lib64/mysql/plugin/libscwmi.so UDF函数创建 : 命令执行 : 通过UDF函数执行系统命令 获取命令输出 6. 清理过程 退出时SQLMAP会: 删除UDF函数(sys_ exec和sys_ eval) 提示需要手动删除UDF共享库文件 四、常规注入获取Webshell 1. 基本流程 利用 SELECT ... INTO OUTFILE ... LINES TERMINATED BY 上传小马 通过小马上传完整Webshell 使用Webshell执行命令(参数如cmd=whoami) 2. Webshell功能 Webshell可能使用的PHP函数: system() proc_ open() shell_ exec() passthru() popen() exec() 五、防御建议 不要以root用户运行MySQL : 官方明确警告此操作极其危险 任何有FILE权限的用户都能以root身份创建文件 合理配置secure_ file_ priv : 限制文件操作目录 需要修改配置文件并重启服务生效 目录权限控制 : 避免给web目录(如/var/www/html)777权限 严格控制插件目录权限 六、技术总结 UDF提权关键点 : MySQL服务运行用户权限 secure_ file_ priv参数配置 插件目录可写权限 两种os-shell区别 : UDF提权:获取System Shell(系统级权限) 常规注入:获取Webshell(受限于Web服务器权限) 实际利用条件 : 需要MySQL高权限账户 需要能够修改MySQL服务配置 或系统管理员配置不当(如目录777权限) 七、参考资源 MySQL官方安全建议: Never run the MySQL server as the Unix root user secure_ file_ priv参数文档: server-system-variables SQLMAP支持的UDF: 内置MySQL和PostgreSQL的UDF so文件 抓包分析: 可参考附件中的Pcap示例