大家好,我是小编
今天我想和大家聊聊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服务器崩溃。
最近微信公众号来了很多新朋友
小编很高兴
希望你们能在这里有收获
还是那个期待:一直在一起
领取专属 10元无门槛券
私享最新 技术干货