sir

mysql 读写文件特性和OOB注入

Mysql 中读写文件主要是load_file和into outfile 和 into dumpfile, mysql 的导入导出的功能从mysql5版本起都受 系统变量@@secure_file_prev 影响,我们来看一下官方的解释

image.png

This option sets the secure_file_priv system variable, which is used to limit the effect of data import and export operations, such as those performed by the LOAD DATA and SELECT ... INTO OUTFILE statements and the LOAD_FILE() function. For more information, see the description of secure_file_priv.

在<=5.7.5版本的mysql里面默认值为empty, 在大于5.7.6里面是platform sepcific(linux 默认是/var/lib/mysql-files),表示读写只能在这个目录下面。(有的文章说是5.5.53版本开始,这个未做考证,暂时以官方为主)

该变量有三种取值,empty,NULL, 某个具体路径:

Secure_file_priv是一个全局变量,它是一个只读变量,你不能在运行时改变它。也就是说如果此种注入比较依赖版本。修改这个值的方法只能在配置文件里面修改,在mysql里面是无法修改的。

windows下:修改my.ini
在[mysqld]内加入secure_file_priv =

linux下:修改my.cnf(可能是/etc/mysql/mysql.conf.d/mysqld.cnf)
在[mysqld]内加入 secure_file_priv =/tmp
然后重启mysql,再查询secure_file_priv

into outfile 和 into dumpfile的区别

outfile 写完文件后会在文件后加一个\n换行符,而dumpfile不会

这两个函数的原本作用是导出数据做备份。

注意outfile 和 dumpfile后面的路径都不能是十六进制。请注意,如果过滤引号,无法使用十六进制会话或者其他格式作为文件路径

mysql OOB带外注入

当涉及到MSSQL与Oracle时,Out-of-Band 注入是非常好的方式, 但在mysql中却并非如此,因为mysql的secure_file_priv 配置禁止了mysql的导入导出。

解决的办法:

在mysqld的配置中设置该属性为空

下面的payload 也都只能在window下执行,在linux下运行不了,这个还不知道为什么。

OOB注入语句:

image.png

另外,查询的数据中不能有特殊字符,因为concat做的是连接操作,查询的数据会作为子域名的一部分,如果域名中存在特殊字符(比如都好,* {}等)就会解析失败,因此最好就一个hex函数加密传输一下)

image.png

参考:

https://segmentfault.com/a/1190000009333563

https://dev.mysql.com/doc/refman/5.7/en/server-options.html

http://c1em0.cn/2017/11/14/MySQL%20OOB%E6%B3%A8%E5%85%A5/

喜欢 0