SQL注入之联合查询法(基于Metasploitable2-Linux)

1、联合查询
在之前的文章中,我们已经学习了SQL注入的基本步骤,而联合查询法其基本步骤一样。
分别是:猜闭合方式、用二分法来猜测表的列数、观察显示位、寻找数据库、寻找表、寻找列、寻找数据

2、用联合查询的方式在Metasploitable2-Linux的Less-1中进行SQL注入
(1):猜闭合方式
在一般情况下,我们要进行SQL注入是无法得知闭合方式的,所以我们一般用手工进行不断的猜测,或用工具和脚本进行不断的测试,从而得到闭合的方式。
而在我们这种训练和学习中,可以进入其网页脚本中去得到闭合的方式。

在Metasploitable2-Linux中,其位置在/var/www/sqli-labs-master目录下
SQL注入之联合查询法(基于Metasploitable2-Linux)

而关卡less-1网页下的脚本是index.php
SQL注入之联合查询法(基于Metasploitable2-Linux)

在查看其脚本后,可以发现其闭合方式为单引号
SQL注入之联合查询法(基于Metasploitable2-Linux)
接下来,在网页上进行测试。语句为:/?id=1’ and 1=1 --+
其中:
1):单引号表示这个脚本的闭合方式,而在网页中闭合方式会被隐藏;原本sql=“–”中被双引号括起来的,是被闭合的内容;而这个单引号将其闭合打破,再用and这一特殊语句,将所需的语句输入其中并与数据库进行交互。
2):–+为注释符号,为#的源码,可以注释掉原来的闭合,使其不会生效。

反应1:输入语句后,若闭合方式正确,而且and后边的语句1=1正确,则网页会显示正常
SQL注入之联合查询法(基于Metasploitable2-Linux)

反应2:输入语句后,若闭合方式不正确,而and后边的语句1=1正确,则网页会显示正常,这时需要用1=2在试一试,若还是可以显示,则闭合方式错误。
SQL注入之联合查询法(基于Metasploitable2-Linux)
(若闭合方式正确,而and后边的语句1=2不正确,则网页也不会显示正常)

(2)、用二分法来猜测表的列数
语句:/?id=1’ order by () --+
order by ()数SQL中的一个排序函数,可以用来爆列数
规律:输入的数字,回复正常,则库中大于或等于所输入的数字;不正常,则代表输入数字超出数据库的列数。
方法:用二分法和规律进行结合,快速猜出。
首先,我们选择5,然而没有显示正确的页面,故超出正确的列表数。
SQL注入之联合查询法(基于Metasploitable2-Linux)

我们选择3,出现正确的画面,故3大于或等于正确的列表数。
SQL注入之联合查询法(基于Metasploitable2-Linux)
然后,我们在用4来确认一下,结果是超出,故列数为3。
SQL注入之联合查询法(基于Metasploitable2-Linux)

(3)、观察显示位
显示位是用来为后边的查询做准备,主要是分辨出哪一个位置会出现与数据库交换后的回馈,从而得到数据。
语句为:/?id=-1’ union all select 1,2,3 --+
其中:union all 表示将前边和后边的结果全部输出,而id=-1这一错误语句是union all不会去执行,从而到达不干扰后边语句结果的同时,进行输出。
SQL注入之联合查询法(基于Metasploitable2-Linux)
得出,其2和3是显示位。

(4)、寻找数据库
语句1: /?id=-1’ union all select 1,2,database() from information_schema.schemata --+
语句2:/?id=-1’ union all select 1,2,group_concat(schema_name) from information_schema.schemata --+
语句3:/?id=-1’ union all select 1,2,limit0,1(schema_name) from information_schema.schemata --+
其中:
database()函数:可以将这个网页所交互的数据库直接回显出来
group_concat()函数:可以查询所需要的数值,将其结果以行的形式全部表示出来
limit0,1()函数:可以查询所需要的数值,并操纵数字得到想要位置的数据(0表示从第一行开始;1表示取第一个数据)
SQL注入之联合查询法(基于Metasploitable2-Linux)
SQL注入之联合查询法(基于Metasploitable2-Linux)
得出,库为security

(5)、寻找表
已经得到数据库名为security,则可以在information_schema.tables表中进行查找。
语句: /?id=-1’ union all select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
SQL注入之联合查询法(基于Metasploitable2-Linux)

(6)、寻找列
已经知道库名(security)和表名(users),故可以在information_schema.columns表中进行查找
语句: /?id=-1’ union all select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+
SQL注入之联合查询法(基于Metasploitable2-Linux)

(7)、查找所需要的数据
已经知道库名(security)和表名(users)和列(id,username,password)
可以查找到想得到的数据(例如要得到username和password)
语句:/?id=-1’ union all select 1,group_concat(username),group_concat(password) from security.users --+
SQL注入之联合查询法(基于Metasploitable2-Linux)