Mysql注⼊中的outfile、dumpfile、load_file函数详解
在利⽤sql注⼊漏洞后期,最常⽤的就是通过mysql的file系列函数来进⾏读取敏感⽂件或者写⼊webshell,其中⽐较常⽤的函数有以下三个
into dumpfile()
into outfile()
load_file()
我们本次的测试数据如下
读写⽂件函数调⽤的限制
因为涉及到在服务器上写⼊⽂件,所以上述函数能否成功执⾏受到参数secure_file_priv的影响。官⽅⽂档中的描述如下
翻译⼀下就是
其中当参数secure_file_priv为空时,对导⼊导出⽆限制
当值为⼀个指定的⽬录时,只能向指定的⽬录导⼊导出
当值被设置为NULL时,禁⽌导⼊导出功能
这个值可以通过命令select @@secure_file_priv查询。由于这个参数不能动态更改,只能在mysql的配置⽂件中进⾏修改,然后重启⽣效。
dumpfile与outfile的区别
导出数据库场景下的差异
select …… into outfile
我们先来看⼀下mysql官⽅⽂档⾥对于这两个函数的解释
其中有两个值得注意的坑点
outfile函数可以导出多⾏,⽽dumpfile只能导出⼀⾏数据
outfile函数在将数据写到⽂件⾥时有特殊的格式转换,⽽dumpfile则保持原数据格式
我们接下来通过导出测试看看这⾥⾯的细节
⾸先通过命令select * from test into outfile '/'来使⽤outfile导出
可以看到⽂件/⽂件中保存了所有的数据并且在⼀⾏数据的末尾⾃动换⾏
通过查看官⽅⽂档,可以看出使⽤如下参数可以进⾏格式调整
其中FIELDS ESCAPED BY可以⽤来对指定的字符进⾏转义,FIELDS [OPTIONALLY] ENCLOSED BY⽤来对字段值进⾏包裹, FIELDS TERMINATED BY⽤来对字段值之间进⾏分割
例如使⽤如下命令select * from test into outfile '/ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " 'LINES TERMINATED BY '\n'
得到的导出⽂件如下
select …… into dumpfile
⽽接着使⽤命令select * from test into dumpfile '/'使⽤dumpfile进⾏导出
可以看到此命令在执⾏的时候提⽰输出超过⼀⾏
查看⽂件内容
可以看见通过dumpfile导出的数据⾏数据之间并未进⾏换⾏且只导出了部分数据
php远程连接mysql数据库
写⼊webshell或者udf下的差异
select …… into outfile
我们使⽤命令select 'a\naa\raaaa' into outfile '/'来看⼀下在常⽤的写⽂件场景下的结果
可以看到outfile对导出内容中的\n等特殊字符进⾏了转义,并且在⽂件内容的末尾增加了⼀个新⾏
我们接着使⽤命令select 'a\naa\raaaa' into dumpfile '/'来看⼀下
可以看到dumpfile对⽂件内容是原意写⼊,未做任何转移和增加。这也就是为什么我们在平常的UDF提权中使⽤dumpfile进⾏dll⽂件写⼊的原因
还有⼀个需要关注的点就是:outfile后⾯不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注⼊中更加⿇烦,因为会⾃动将单引号转义成\',那么基本就GG了,但是load_file,后⾯的路径可以是单引号、0x、char转换的字符,但是路径中的斜杠是/⽽不是\
总结
以上所述是⼩编给⼤家介绍的Mysql注⼊中的outfile、dumpfile、load_file函数详解,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。