打开APP
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
详详详解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辅助模块来dump MySQL哈希值。


用户“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” 的内容如下所示:


MySQL 5.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服务器崩溃。



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
[转]MYSQL中的UDF – Can’t open shared library 的研究...
我必须得告诉大家的MySQL优化原理2
提权,以MySQL之名_安全教程_脚本之家
qqhelper
Firebird 数据库使用心得
MySQL :: MySQL 5.1参考手册 :: 27. 扩展MySQL
更多类似文章 >>
生活服务
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服