详详详解MySQL UDF执行命令

大家好,我是小编

今天我想和大家聊聊mysql

本文的技术内容较老

但胜在详细

希望大家能有收获

前言

我们在Web应用程序中发现了SQL注入,并且能够从mysql.user中dump用户名和密码,它有权将文件写入磁盘。本文中我们将介绍如何向UDF库中注入MySQL并获得代码执行,以及在Windows中弹出shell的技巧。

首先,我们运行带有“-secure-file-priv =”参数的mysqld服务器,并将它设置为空白,接下来我们使用内部网络中基于联合的注入,从mysql.user表中检索用户名和密码。

需要注意的是,在MySQL 5.7及更高版本中,密码列并不存在,它被更改为“authentication_string”。

当然,如果你已拥有数据库凭据,则可以使用metasploit中的mysql_hashdump.rb辅助模块来dumpMySQL哈希值。

用户“osanda”的主机列允许来自“192.168.0.*”的连接,这意味着我们可以利用该用户从IP范围中进行远程连接,这样就可以破解密码的哈希值并获得纯文本密码。

登录到MySQL后,查看当前用户的权限。

显然,我们有权读取和写入文件,这样就可以在其中编写UDF DLL库并获得代码执行。

什么是UDF库

UDF表示MySQL中的用户定义函数,就好像在DLL中编写自己的函数并在MySQL中调用它们一样。

我们使用可在Metasploit框架内找到的“lib_mysqludf_sys_64.dll”DLL库,也可以使用基于Metasploit安装目录“/ usr / share / metasploit-framework / data / exploits / mysql /”的操作系统和体系结构的UDF库。

首先,我们来检查运行MySQL的体系结构。从全局变量“@@ version_compile_os”中可以看到MySQL实例的体系结构,从“@@ version_compile_machine”中可以看到操作系统的体系结构,在上述情况下,我们在64位的Windows操作系统中运行MySQL,情况如下:

从MySQL 5.0.67版本开始,UDF库都包含在plugin文件夹中,我们可以使用全局变量“@@ plugin_dir”找到它,这个变量可以在mysql.ini文件中找到并进行编辑。

我们可以通过将新的取值传递给mysqld来更改插件目录的变量。

另一种方法是用插件目录编写一个新的mysql配置文件并将其传递给mysqld。

“my.ini”的内容如下所示:

在MySQL5.0.67之前的版本中,文件位于系统动态链接的目录中。以下是文档中提到的文字。

在旧版本中,我们可以将DLL文件上传到以下位置并创建新的UDF功能。

@@datadir

@@basedir\bin

C:\windows

C:\windows\system

C:\windows\system32

上传二进制文件

上传二进制文件有很多方法。

1.load_file函数支持网络路径,如果将DLL复制到网络共享中,则可以直接加载它并写入磁盘。

2.用一个十六进制编码的字符串将整个DLL文件写入磁盘。

3.创建一个表并将二进制数据插入到十六进制编码流中,其中的二进制数据用update语句来连接。

4.直接在磁盘上将文件从网络共享加载到第三种方法创建的表中,使用“load data infile”语句在本地加载。像上图所示将文件转换为十六进制,并在写入磁盘时取消编辑。

5.使用MySQL 5.6.1和MariaDB 10.0.5中介绍的函数“to_base64”和“from_base64”上传二进制文件。

编辑base64文件并将下面的内容dump到插件目录中。

之后就可以像下面这样将整个文件传递给mysql。

6.使用上面讨论的“load data infile”语句,直接从网络共享或本地编写base64编码文件,并像下面这样dump。

函数探索DLL

不同于其他人只关注Metasploit内部这个DLL中的“sys_exec”函数,我们选择扭转这个DLL并探索其他功能。检查导出目录,可以看到几个更有用的函数:

sys_exec

该函数能在系统函数内传递参数“args-> args [0]”,我们可以利用它在目标机器上执行系统命令。

安装

验证

删除

sys_eval

该功能将执行系统命令并在屏幕上显示,使用“_popen”函数和“r”参数,通过返回的流(stream)读取衍生命令的标准输出,使用“fgets”来读取连接到缓冲区的管道,然后返回到缓冲区。

安装

验证

删除

例如:

sys_get

该函数使用“getenv”函数恢复系统变量的值。

安装

验证

删除

例如:

执行Shellcode - sys_bineval

在这个DLL里面找到函数“sys_bineval”,该函数使用“VirtualAlloc”API分配RWX内存,并使用“strcpy”将“args-> args [0]”复制到新分配的内存中。这个缓冲区就被传递给“CreateThread”API用来产生一个新的线程。

在“CreateThread”API中,使用“strcpy”复制缓冲区的“lpParameter”,以此作为指针传递给线程。

“StartAddress”中的函数将直接移动“lpParamter”并调用ptr rax,这会改变指向我们shellcode的RIP。

安装

验证

删除

例如:

这些外部UDF函数在拆解代码中没有发生异常,但是在调用这些函数时稍有不慎就会导致mysqld.exe服务器崩溃。

最近微信公众号来了很多新朋友

小编很高兴

希望你们能在这里有收获

还是那个期待:一直在一起

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180228A1CQQ700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券