在学习SQL语句的时候,听朋友推荐,使用sqli-labs-master靶场练习,这里也是用过很长时间把sqli-labs-master环境搭好,现在呢玩到了第二关,由于第二关和第一关的内容基本一样,所以就讲解第二关的通关方法,遇到的小伙伴一起试一试吧!
在开始之前呢,我们需要先点击 Setup/reset Database for labs,这样靶机中才会生成数据库,然后才能进行下一步:
然后使用我们的鼠标滑轮下滑,就会发现关卡了,我们点击Less-2进入关卡
进入关卡后发现,这里就已经提示我们开始第一步啦!请输入ID作为带数值的参数。
下一步呢我们就进行查询,怎么查询呢?在网址中输入“?id=1”,因为小编这里使用的是phpstudy搭的数据库环境,如果报错的话可以试一试“?index.php?id=1”
注意:这里的“id=1”回显的信息是表中的id信息,其中id有很多,也可以输入“2,3,4,5.....”,
我们在进行SQL注入时需要查我们的字段数,这里用 order by来找出数据库中的字段数,由于order by的排序特性,我们可以一个一个输入“1,2,3.....”,这样直到它报错就可以知道有几个字段数了。
?id=1 order by 1
这里面的%20代表空格,可以发现,当我们输到4的时候,出现报错了,那我们就可以知道字段数为3了
当我们知道了这个里面有3个字段数了以后,我们就可以使用union函数,由于union函数在合并查询时,两个语句都是独立存在,就算其中一个语句输错了,只要另外一个不错,也能查出来,但是字段数需要相同
这就提供了一个思路,我们就可以使用union函数得到想要的信息:
?id=99 union select 1,version(),3
知道了数据库的版本信息,那我们也可以用这样的方法得到数据库的库名,只要知道了数据库库名和数据库版本信息,就完成一大半了
?id=99 union select 1,version(),database()
通过前面的方法,我们知道了很多信息,接下来我们就可以利用这些信息查询数据库中表的信息,使用对应SQL进行注入
首先我们知道靶机中的数据库<5.0,属于高版本,我们还知道数据库中的库名是security,这样就可以使用information_schema.tables查找表名
?id=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
我们可以发现这里面一共含有4张表,其中users表含有敏感信息的可能性最大!既然知道了表名,那就简单多了,同理,使用上述方法查出字段:
?id=99 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
查出字段后发现username和password字段,接下来进入字段查看数据信息
?id=99 union select 1,2,(select group_concat(username,0x3a,password)from users)
这样我们就拿到用户名和密码通关啦!本次实验中,运用到了许多数据库语言,大家在学习SQL入注之前,强烈建议先去学习Mysql数据库语言,这样在实验过程中会减少很多碰壁