天天看点

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

文章目录

  • 前言
  • 第一关
  • 第二关
  • 第三关
  • 第四关
  • 第五关
  • 小结

前言

sqli-labs是一个进行sql注入的一个靶场

第一关

第一关上面有一串英文

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

这个意思就是说让你在赋予一个id值

同时我们也试过了不同的id值

从零开始的sql注入前言第一关第二关第三关第四关第五关小结
从零开始的sql注入前言第一关第二关第三关第四关第五关小结

可以看到id不同页面不同。那么试一下在注入类型

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

除去最前面和最后面的单引号,我们可以看出报错信息。大家看报错信息的时候最前面的’和最后面的’其实是数据库自带的报错信息,可以忽略,只是单纯的为了隔开错误内容而已。意思是2’'出现了错误。由此可知它是字符型注入。然后进行字段查询。这里讲一下为什么要查询字段数,在联合查询中(union select)前后查询的字段数应该是相同的。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

order by的用法为order by column。意思是让数据库按照字段column进行排序。后面加数字也就是说按照第几个字段进行排序。这个大家可以自己式一下。那么如果用户输入的字段数与大于数据表本身拥有的字段数时,就会报错。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

会发现这里一共三个字段。页面输出的某些内容来自数据库的一些字段,这样我们就可以看一下哪些位置取自数据库。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

可以看出name和Password这里取自数据库的第二和第三字段。那我为什么又把union select前面的2加了个负号呢?这是因为不加负号的话页面仍然会显示id=2时的信息,加了负号,由于数据库中没有id=-2,就会显示union select后的信息。然后我们甚至可以猜一下它后端的语句:select name,password from tables where id=’$id’。对了,这里再说一下–+的作用。在sql语句中–是注释的意思,从-序列到行尾。在MySQL中,-(双破折号)注释样式要求第二个破折号后接至少一个空格或控制字符(例如空格,制表符,换行符等)。此语法与标准SQL注释语法稍有不同,而在很多url地址栏中都会把+视为空格。所以才需要–后留一个加号,也就是说你最后不一定–+,–'也可以,将最后的那个’闭合。

好了,知道了上面的这些东西,我们继续。刚才已经显示出2,3.那么我们完全可以将3换为version()

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

显示出了版本。然后我们还可以看一下它的数据库,将2改为database()

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

这基本就完成了。剩下想查询什么东西我们随便查。但是记住,必须让查询的东西都处于一个字段内,这里提供一个group_concat()函数,将多行信息进行连接。剩下就看大家想查询什么了。这里就点到为止

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

第二关

还是上面讲的做法,先判断注入类型。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

注意看报错信息。意思是语句limit前多了一个’。这意味着我们加的这个’是多余的。看来这是一个数字型注入。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

同样order by测试字段数。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结
从零开始的sql注入前言第一关第二关第三关第四关第五关小结

发现还是3个字段。同样的手段,同样的方法。和第一关一样,就是单纯的注入类型不同。

第三关

第三关这个也很简单。先来看一下注入类型。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

可以发现这次报错内容不太一样了。意思是’3’’) LIMIT 0,1出现了错误。根据报错信息来说,它的用户输入被括号包围起来了。那我们完全可以将括号闭合。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

这样就对了。那么我们来猜一下它的语句:select name,password from table where id = (’$id’).好了,这就是最重要的了,剩下的和前面就一样了,这里是最特殊的。

第四关

随着关数的提高,出题人确实越来越苟。我们看一下,发现不管数字后是否加单引号都能出来页面。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结
从零开始的sql注入前言第一关第二关第三关第四关第五关小结

大家一定要记住,各种各样的字符多试几次,发现"可以引发报错

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

再加上后面的括号,最后发现可以。好了,剩下的做法也没啥特殊的了。

第五关

这里大家发现不管id该为几页面都不会发生变化。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结
从零开始的sql注入前言第一关第二关第三关第四关第五关小结

但是我们还是先看一下注入类型。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

这一看单纯的字符型注入是没得跑了。既然普通的联合查询行不通了,我们就可以考虑布尔注入。布尔注入之前,我们先进行一个测试。就是再id后加上and 1=1

and 1=2查看页面回显状态是否不同。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结
从零开始的sql注入前言第一关第二关第三关第四关第五关小结

and进行且运算,后面1=1布尔值为1,经过且运算后最终也为1。而1=2布尔值为0,经过且运算最终布尔值为0。也就是说不同的布尔值也可能使页面发生不同的回显。那我们先来一个小测试。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

会发现我完全可以把1=2这个布尔值换一种形式进行表达。那我们可以通过这种方法爆出数据库的长度。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

也就是说页面正常回显说明后面输入的语句是正确的,非正常回显说明是错误的。就像上面个两个,数据库名字的长度小于10正常回显,说明确实小于10,小于5并没有正常回显,说明它大于等于5。

从零开始的sql注入前言第一关第二关第三关第四关第五关小结

说明当前数据库名字长度为8。剩下的工作就是猜,结合一系列函数。当然,通过脚本爆出数据库名也可以。不过最重要的还是要知道原理。

小结

一共是五关,总结一下:其中有联合查询,联合查询分为字符型注入和数字型注入;字符型注入的注入方式更加多样,所以可以尝试很多种注入方法,关键看报错内容,分析报错内容可以进行简单的后台源码猜测。数字型注入相对来说比较单纯。布尔注入手注比较麻烦,所以可以借助工具来进行爆破。布尔注入的另一种表现形式为延时注入,下次再遇到这类题可以演示一下这种方法