udf提权

最近在看师傅们的面经,因为自己也准备去工作了,想趁着这个时间把面试中经常问到的问题进行系统的学习一下,在此记录一下,可能有些地方写的不够详细,后期再补充说明

udf提权

提权过程

udf提权在windows提权时候使用的是udf.dll,sqlmap中自带有,不过udf.dll是通过异或编码的,使用之前一定要记得解码,解码的工具也在sqlmap中

udf.dll存放位置

kali环境下:

/usr/share/sqlmap/data/udf/mysql

分为linux和windows两个版本

解异或编码的脚本存放位置:

/usr/share/sqlmap/extra/cloak

解密payload

python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ 

解密之后会在当前目录下生成dll文件

将生成的dll文件,上传到mysql的/lib/plugin目录下,执行命令

create function cmdshell returns string soname "lib_mysqludf_sys.dll";
或
create function sys_exec returns string soname "lib_mysqludf_sys.dll";

可根据十六进制编辑器打开udf.dll,看一下有哪些函数可以创建进行具体替换。

即可成功提权,尝试执行命令:

select sys_exec("calc");

提权条件:

如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下/
如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
拥有可以将udf.dll写入相应目录的权限。

原理分析:

其实总结一下udf提权的思路,本质意义上来说就是利用mysql的特性去创造一个能调用系统命令的函数。

首先了解一下udf:

udf='user defined funtion' # 用户自定义函数

udf的主要功能是通过添加新函数,对MYSQL的功能进行扩充,udf在mysql5.1以后的版本中,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写。

如何利用udf:

udf文件名为‘udf.dll’,存放在Mysql根目录(通过select @@basedir可知)的‘lib/plugin’目录下。在udf中,我定义了名为sys_eval的mysql函数,可以执行系统任意命令。如果我现在就打开mysql命令行,使用select sys_eval(‘dir’);的话,系统会返回sys_eval()函数未定义。因为我们仅仅是把‘udf.dll’放到了某个文件夹里,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。

我们需要使用语句进行函数创建

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

只有两个变量,一个是function_name(函数名),我们想引入的函数是sys_eval。还有一个变量是shared_library_name(共享包名称),即‘udf.dll’。至此我们已经引入了sys_eval函数,下面就可以直接使用命令了,这个函数用于执行系统命令,用法如下:

select sys_eval('whoami');

注意,在高版本的mysql数据库中,不存在lib/plugin目录,需要我们自己在mysql的目录下生成目录,例如phpstudy2019,我们需要将生成的udf.dll存入到下面的目录中,执行生成函数命令即可

D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin

image.png-55.9kB

image.png-210.2kB

可以看到我们可以通过调用自己生成的函数以系统用户的形式去调用系统命令,达到了提权的目的

同理linux环境下的udf提权也是一样,我们需要使用sqlmap中的

/sqlmap/data/udf/mysql/linux/64

目录下的文件生成.so拓展库文件,再将拓展库文件放入mysql的目录下

/usr/lib/mysql/plugin

执行相同命令即可

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';

参考文章:

https://blog.csdn.net/weixin_33774308/article/details/94563406


发表评论

电子邮件地址不会被公开。 必填项已用*标注