[20][03][40] MySQL 注入的 outfile/dumpfile/load_file 函数详解

在利用 sql 注入漏洞后期,最常用的就是通过 mysql 的 file 系列函数来进行读取敏感文件或者写入 webshell,其中比较常用的函数有以下三个

  • into dumpfile()
  • into outfile()
  • load_file()

测试如下
xx

1. 读写文件函数调用的限制

因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响.官方文档中的描述如下:

xx

  • 其中当参数 secure_file_priv 为空时,对导入导出无限制
  • 当值为一个指定的目录时,只能向指定的目录导入导出
  • 当值被设置为 NULL 时,禁止导入导出功能

这个值可以通过命令 select @@secure_file_priv 查询.由于这个参数不能动态更改,只能在 mysql 的配置文件中进行修改,然后重启生效

2. dumpfile 与 outfile 的区别

导出数据库场景下的差异
select …… into outfile 先来看一下 mysql 官方文档里对于这两个函数的解释

xx
xx

其中有两个值得注意的坑点

outfile 函数可以导出多行,而 dumpfile 只能导出一行数据
outfile 函数在将数据写到文件里时有特殊的格式转换,而 dumpfile 则保持原数据格式

接下来通过导出测试看看这里面的细节
首先通过命令 select * from test into outfile '/tmp/test.txt' 使用 outfile 导出
可以看到文件 tmp/test.txt 件中保存了所有的数据并且在一行数据的末尾自动换行

xx

通过查看官方文档,可以看出使用如下参数可以进行格式调整

xx

其中 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' 的导出文件如下

xx

select …… into dumpfile
而接着使用命令 select * from test into dumpfile ‘/tmp/test.txt’ 使用 dumpfile 进行导出可以看到此命令在执行的时候提示输出超过一行

xx

查看文件内容

xx

可以看见通过 dumpfile 导出的数据行数据之间并未进行换行且只导出了部分数据 3|0 写入 webshell 或者 udf 下的差异

3. 写入 webshell 或者 udf 下的差异

select …… into outfile
使用命令 select ‘a\naa\raaaa’ into outfile ‘/tmp/test.txt’ 来看一下在常用的写文件场景下的结果

xx

可以看到 outfile 对导出内容中的\n 等特殊字符进行了转义,并且在文件内容的末尾增加了一个新行接着使用命令select 'a\naa\raaaa' into dumpfile '/tmp/test.txt' 来看一下

可以看到 dumpfile 对文件内容是原意写入,未做任何转移和增加.这也就是为什么在平常的 UDF 提权中使用 dumpfile 进行 dll 文件 写入的原因
还有一个需要关注的点就是:outfile 后面不能接 0x 开头或者 char 转换以后的路径,只能是单引号路径.这个问题在 php 注入中更加麻烦,因为会自动将单引号转义成’, 那么基本就 GG 了,但是 load_file,后面的路径可以是单引号,0x,char 转换的字符,但是路径中的斜杠是/而不是\

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值