【SQLi-Labs刷题记录】 第七关思路

/*
作者刚刚接触sql注入,本文仅用作记录刷sqli-labs靶场时的思路,仅代表个人的看法,如有不当之处,欢迎各位大佬及时批评指正!
*/

根据关卡的名称dump into outfile可知,sqli-labs第七关的考查点是数据库的文件操作。

SQLi-Labs Less-7

首先,按照提示输入id参数,尝试寻找注入点
构建url: …/Less-7/?id=1
【SQLi-Labs刷题记录】 第七关思路

页面显示正常,提示使用outfile语句
构建url:…/Less-7/?id=1’
【SQLi-Labs刷题记录】 第七关思路
页面报错,但是没有提示报错信息。输入引起报错,我们初步判断网站存在注入点,但是网站没有提示报错信息,我们只能通过不断尝试,来猜测原来sql语句的闭合方式,通过不断尝试,我们猜测到了原有sql语句的闭合方式。
构建url:…/Less-7/?id=1’)) --+
页面显示正常,我们猜测原有的sql语句为: select * from table where id = ((‘input’)) limit 0,1,其中input为输入内容。
然后,我们可以根据提示,尝试使用outfile语句。这里需要注意的是在MySql中,into outfile函数的权限是很容易忽略的一个点,其中涉及到了几个关键的变量,分别是secure_file_priv, datadir 和 PrivateTmp。下面简单介绍一下这三个变量。
(1)secure_file_priv
这个参数主要用来限制数据的导入导出效果(load data, into outfile等)。如果这个参数值为NULL,那么mysql会禁止用户进行导入导出操作;如果这个参数是一个具体的目录名,那么数据的导入导出只能在该目录下进行;如果这个参数为空,那么导入导出的文件位置将不受限制。
该参数的设置,可以在my.cnf配置文件中修改,而在搭建的SQLi-Labs环境中下需要在配置的phpstudy环境中修改,具体修改方法因配置环境而异,此处不作讲解。
(2)datadir
这个参数是MySql存放数据文件的目录,也是导入导出操作的相对路径
(3)PrivateTmp
使用Systemd进程作为启动进程的linux系统,其子进程都会有一个属性叫PrivateTmp,用于设置是否使用私有的tmp目录。

由于第七关不能显示数据库返回的信息,因此我们可以先用前几关查看一下网站数据库的相关参数。
以第一关为例构建url:…/Less-1/?id=1’ and 1=2 union select 1,@@datadir,@@secure_file_priv–+
【SQLi-Labs刷题记录】 第七关思路

根据页面的反馈信息我们可以知道,目标网站的数据库secure_file_priv参数值为空,而datadir地址为:/www/mysql_data/mysql-5.5.62/data/
紧接着我们就可以在第七关中进行数据导出操作,根据前几关的经验,我们已经大致清楚了security数据库的结构,因此可以直奔主题,提取网站的用户名和密码。
构建url:…/Less-7/?id=1’))%20 and 1=2 union slect id,username,password into outfile ‘outcome.php’–+
【SQLi-Labs刷题记录】 第七关思路
网站依然报错,但是我们查看数据库的根目录(@@datadir)可以发现,已经生成了outcome文件,并且打开可以看到我们需要的用户名和密码。
【SQLi-Labs刷题记录】 第七关思路
由于之前我们发现,网站的secure_file_priv参数为空,因此我们除了将数据导出到数据库的根目录,还可以导出到指定目录。
构建url: …/Less-7/?id=1’))%20 and 1=2 union slect id,username,password into outfile ‘//tmp//outcome.php’–+
此时网站的返回信息依然报错,但实际上我们已经成功将数据导出了。但是导出的位置或许和我们想象的不太一样。打开/tmp目录,发现没有找到我们想要的outcome文件。这是因为数据库服务启用了PrivateTmp服务,使用了自己私有的tmp目录,具体的目录位置,可以在命令行里通过locate语句进行查询。

以上就是第七关解题的主要思路,其中关键的难点在于into oufile的操作权限问题,一方面数据库要能对数据进行导入导出操作;另一方面数据库对于导入导出的目标路径要有读写权限。