漏洞重温之sql注入(完)
漏洞重温之sql注入(九)
sqli-labs闯关之旅(完)
Less-51
进入第51关,首先我们可以看到,这里我们同样需要添加sort参数,以此可以简单判断,这里是order by注入。
然后我们将视线转移到源码的位置。
首先,第一张图片的红框告诉我们该位置需要使用单引号进行闭合,第二个位置则是告诉我们,网页将错误信息打印了出来,也就是说,在这个位置,我们可以使用报错注入。
以此两点,构造payload:
1' and updatexml(1,concat(0x7e,(database()),0x7e),1);
PS:这里要注意一点,order by 注入的结尾,要使用分号,而不是注释符号。具体原因,我会在了解清楚之后写明。
第五十一关,通关。
Less-52
看首页,52关和51关差距几乎没有。
查看源码。
我们提交的参数没有任何的包裹,没有将错误打印到页面的函数,当代码执行成功或者失败,返回的结果不同。我们可以使用的有布尔型盲注和时间盲注。
以此构造payload:
1 and if(substr((database()),1,1)='s',sleep(0.1),1)
因为这里我使用的是时间盲注,所以就不放截图了。
第五十二关,通关。
Less-53
看源码。
根据上面的源码,我们可以得到两个信息,一,该位置需要使用单引号闭合;二,该位置没有报错函数,需要使用盲注。
以此构造payload:
1' and if(substr((database()),1,1)='s',sleep(0.1),1);
第五十三关,通关。
Less-54
首先,我们看54关,这一关最前面几关很类似,都是需要添加id参数,但是可以看到,在页面上多了一行代码。我们直接看源码。
源码的内容有很多,一部分是有关页面上多出的代码的,我虽然不理解逐行代码的含义,但是根据实际操作,能发现,那段代码其实是为了限制我们查询的次数的,如果超过十次,会再判断一次我们的cookie,因为这对我们的注入操作没有任何影响,所以就暂时不用管了。
看上图的那一段的sql代码。
我们可以确认的两点,一.使用单引号闭合;二.不能使用报错注入。
通过上面两点,我们开始构造payload:
1' and 1=2 union select 1,version(),database() --
第五十四关,通关。
Less-55
五十五关的首页,和五十四关,类似,都多了一行限制查询次数的代码,但是因为并不影响我们的查询,所以直接查看源码。
根据上图,我们可以确认两点,一,我们需要使用括号闭合;二,除了报错注入,其他类型注入都可以使用。
根据上面两点,我们构造payload:
1) and 1=2 union select 1,version(),database() --
第五十五关,通关。
Less-56
看页面,五十六关应该和五十五,五十四关类似,应该只是闭合符号不同。
从源码确认了想法,开始构造payload:
1') and 1=2 union select 1,version(),database() --
第五十六关,通关。
Less-57
思路跟前几关类似,看源码。
根据源码给出的信息,构造payload:
1" and 1=2 union select 1,version(),database() --
第五十七关,通关。
Less-58
首页告诉我们,除了限制查询次数之外,网页对我们的注入没有别的限制。
根据源码,我们可以看到,网页并不是根据我们插入的id来回显数据的,所以联合查询显然不能使用了。但是因为下方出现了打印数据库错误的代码,所以提示我们这里可以使用报错注入。
根据得到信息构造payload:
1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --
第五十八关,通关。
Less-59
页面上,第五十九关似乎和前面几关并没有什么不同,但是在看到源码的时候,发现除了五十九关对参数没有报过,五十八关利用单引号包裹之外,其余基本一致。
这里我来说一下,为何在这里联合查询不可以使用,但是报错注入却可以。
首先,我们可以看到,在if代码块里面,系统构造了两个数组,unames和pass数组,在这两个数组里面,存储了账号和密码的信息。
也就是说,我们上面的sql语句是会被代入到数据库中执行的,在这个执行的过程中,返回的结果却不会跟前面一样被放到页面的uname和passwd位置。而是网页得到代码执行成功或失败的信息,如果成功,那么就按照我们提交的id,从数组中取出对应位置的数据。
也就是说,联合查询不能使用,因为我们的代码哪怕执行成功,结果也不会被返回到页面上,但是其他类型的注入却可以。比如布尔盲注,报错注入,时间盲注等。
由此,构造payload:
1 and updatemxl(1,concat(0x7e,(database()),0x7e),1)
第五十九关,通关。
Less-60
第六十关跟前面几关没有区别,只是包裹参数的符号变成了(“”),所以我们使用该符号进行闭合就可以了。
构造payload:
1") and updatexml(1,concat(0x7e,(database()),0x7e),1) --
第六十关,通关。
Less-61
和六十关一样逻辑,根据得到信息构造payload:
1')) and updatexml(1,concat(0x7e,(database()),0x7e),1) --
第六十一关,通关。
Less-62
根据源码,可以确认两点,一,需要使用单引号括号闭合;二,联合查询,报错注入都不可以使用。
根据得到信息构造payload:
1') and length((database()))>1 --
1') and length((database()))>10 --
布尔盲注如何得到全部数据的方法前面有,这里就不多说了。
第六十二关,通关。
Less-63
跟六十二关逻辑一致,我就不废话了。
根据得到信息构造payload:
1' and length((database()))>1 --
1' and length((database()))>10 --
第六十三关,通关。
Less-64
跟前面几关逻辑一致,根据源码得到信息构造payload:
1)) and length((database()))>1 --
1)) and length((database()))>10 --
第六十四关,通关。
Less-65
跟前面几关逻辑一致,闭合有区别。
根据源码构造payload:
1") and length((database()))>1 --
1") and length((database()))>10 --
第六十五关,通关。
这里,我解释一下为什么限制搜查次数这一点在注入攻击中我们可以不处理,首先,他只是限制了我们查询次数。这一点,我们可以猜测他是通过什么限制,是一个账号只能查询这么多次数,还是说一个PC只能查询这么多次。但是不管是什么情况,我们的代码还是能返回我们希望返回的结果。
也就是说,如果是通过账号限制,我们大可以记下前面几次的查询结果,然后换个账号继续,限制PC同理。