0x00 简介
看到了一些文章,有MySQL的udf提权,也有MSSQL的udf提权,这里以MySQL为例
udf是什么?
udf = “user defined function”,即用户自定义函数
是通过添加新函数,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()
如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录
udf在mysql5.1以后的版本中,存在于”mysql/lib/plugin”目录下,文件后缀为”.dll”,常用c语言编写
提权条件
掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数
拥有可以将udf.dll写入相应目录的权限(
secure_file_priv =
)
sqlmap中的udf文件定义的函数
sqlmap里是有udf.dll文件的,就在sqlmap\data\udf\mysql\windows\32目录下,里面有32位和64位,注意:这里的位数是mysql的位数,并不是对方系统的位数
如何使用udf?
那如何使用udf文件呢?
假设我的udf文件名为‘udf.dll’,存放在Mysql根目录(通过select @@basedir可知)的‘lib/plugin’目录下
在udf中,我定义了名为sys_eval的mysql函数,可以执行系统任意命令
如果我现在就打开mysql命令行,使用select sys_eval(‘dir‘);的话,系统会返回sys_eval()函数未定义
因为我们仅仅是把‘udf.dll’放到了某个文件夹里,并没有引入
类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的
所以,我们应该把‘udf.dll’中的自定义函数引入进来
1 | CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; |
只有两个变量,一个是function_name(函数名),我们想引入的函数是sys_eval
还有一个变量是shared_library_name(共享包名称),即”udf.dll”
至此我们已经引入了sys_eval函数,下面就是使用了
0x01 复现
提权中用到的查询语句
1 | SELECT version(); #查询数据库版本 |
至于各个大佬们用到的ads数据流,我是没有实验成功,不过这里还是放出来语句,万一以后有成功的呢
1 | select 'xxx' into outfile 'D:\\mysql\\lib::$INDEX_ALLOCATION'; |
在这里我只能手动创建了,也是相当于获得webshell的情况下的提权
接下来,我们可以直接通过webshell把udf文件直接上传到相关目录
注意:sqlmap中的lib_mysqludf_sys.dll_文件时经过了异或编码的,我们需要进行解码,解码工具在sqlmap中,extra/cloak目录下的cloak.py就是
解码完成会生成如下文件
我们也可以执行sql命令,如下
1 | select hex((select load_file('udf文件'))) into dumpfile '保存的路径\\1.txt'; |
接下来导入我们需要的函数
1 | CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; |
0x02 工具
暗月工具
下载地址:百度网盘 请输入提取码 提取码:8ng0
个人感觉这个工具依然需要在plugin文件夹存在的前提下
打开工具页面如下:
导出udf文件
接下来直接执行命令即可
其他提权工具
可以进行多种提权