MySQL数据库UDF提权学习

Posted Goodric

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库UDF提权学习相关的知识,希望对你有一定的参考价值。

mysql数据库UDF提权学习

——

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

——
——

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

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

我这里以熊海cms1.0为例,网上下载的源码并且搭建在了本地的phpstudy中。

到网站根目录里找。
可以根据文件名中敏感的关键字 conn、config、data、sql、common 、inc等去一个个打开查看内容。
也可以用审计工具去全局搜索关键字。

打开这个文件,可以直接看到记录的数据库配置信息。

——

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

/data/mysql/user.myduser.myi 文件中可能有

打开user.myd ,看到里面有很多经过加密的密码。

然后把那一串进行解密。得到密码root

——

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用户。

执行语句,让所有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提权

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 的导入|导出做限制

看到我这里secure_file_priv的值并不是空,而是null。
可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv=‘’

再次查看secure_file_priv的值为空。

——

上传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路径

但实际上plugin文件夹默认不存在,就只能自己创建了。我这里是5.7版本的。(条件似乎有点多~)

而说到要上传的这个dll文件,就要自己网上或者哪里找了,一些大马上面有这个功能,可以一键导入。
在sqlmap和msf里面也有内置。
sqlmap\\data\\udf\\mysql 路径下Windows和Linux版本都有。

通过语句

select @@version_compile_os, @@version_compile_machine;

查看当前数据库和操作系统的情况。则确定使用Windows和64位的dll文件。

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

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

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

然后在刚刚的dll目录下就生成了解码后的文件。

然后就是把这个文件导入到\\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文件夹中

——

创建自定义函数

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

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

查看函数

select * from mysql.func;

可以看到成功 创建了sys_eval函数

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

select sys_eval(‘whoami’)

过程结束。

以上是关于MySQL数据库UDF提权学习的主要内容,如果未能解决你的问题,请参考以下文章

MySQL UDF提权获取主机控制权

第三方组件提权-Mysql UDF提权

MySQL数据库提权学习

MySQL提权之udf提权(无webshell的情况)

MySQL提权之udf提权(无webshell的情况)

Mysql提权-基于Mysql的UDF提权(Windows系统)1