比较常用的函数有以下三个
- into dumpfile()
- into outfile()
- load_file()
例:查询所有图书信息,并将查询结果导出到文件‘、var/lib/mysql/loan.txt’中,字段之间用逗号分隔。
dumpfile与outfile的区别
导出数据库场景下的差异
select …… into outfile
我们先来看一下mysql官方文档里对于这两个函数的解释
有两个值得注意的点
outfile函数可以导出多行,而dumpfile只能导出一行数据
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式
我们接下来通过导出测试看看这里面的细节
首先通过命令 select * from test into outfile '/tmp/test.txt'
来使用outfile导出
可以看到文件 /tmp/test.txt
文件中保存了所有的数据并且在一行数据的末尾自动换行
可以看出使用如下参数可以进行格式调整
其中 FIELDS ESCAPED BY
可以用来对指定的字符进行转义, FIELDS [OPTIONALLY] ENCLOSED BY
用来对字段值进行包裹, FIELDS TERMINATED BY
用来对字段值之间进行分割
例如使用如下命令 select * from test into outfile '/tmp/test.txt fields terminated by ',' optionally enclosed by' " lines terminated by '\n'
得到的导出文件如下
select …… into dumpfile
而接着使用命令 select * from test into dumpfile '/tmp/test.txt'
使用dumpfile进行导出
可以看到此命令在执行的时候提示输出超过一行
查看文件内容
可以看见通过dumpfile导出的数据行数据之间并未进行换行且只导出了部分数据
写入webshell或者udf下的差异
select …… into outfile
我们使用命令 select 'a\naa\raaaa' into outfile '/tmp/test.txt'
来看一下在常用的写文件场景下的结果
可以看到outfile对导出内容中的\n等特殊字符进行了转义,并且在文件内容的末尾增加了一个新行
我们接着使用命令 select 'a\naa\raaaa' into dumpfile '/tmp/test.txt'
来看一下
可以看到dumpfile对文件内容是原意写入,未做任何转移和增加。这也就是为什么 我们在平常的UDF提权中使用dumpfile进行dll文件
写入的原因