联合注入
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#
来查询三个字段中的所有数据
拿下。