上一次课讲解的是sql基于布尔型盲注,紧接着这节讲基于时间的盲注
布尔型盲注,是在我们判断网站是否存在注入的时候,网页不会暴漏错误信息,但会返回正确的页面或者错误的页面,我们基于这种情况,用猜测的办法去获取的我们想要的信息
但是现在有一种情况,不管你在url后面如果构造,也没永远返回一个,也就是说不会报错
如下图
正常的页面
随便在url后面加单引号
两个页面返回的是一模一样的,所以这样我们就没办法用布尔型盲注了
那怎么办呢?
道高一尺,魔高一丈
先来学几个函数
1 sleep函数
Sleep()括号里面直接带上要延时的时间,比如10s就是sleep(10),效果如图
2 mysql 的if语句(函数)
格式:IF(Condition,A,B)
意义:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。
把if 和 sleep 组合使用,如图
其实到这一应该就可以看出来,我们通过if 和sleep两个函数去组合,构造出类似我们上一节课布尔型盲注的效果。
布尔型盲注返回的是正确或者错误
时间盲注返回的是延时或者不延时
所以道理是相通的
这里直接带入第九关卡这道题目
用sleep函数去判断sql查询语句的形式
http://127.0.0.1/Less-9/?id=1 and sleep(5) --+ 直接返回页面
http://127.0.0.1/Less-9/?id=1’ and sleep(5) --+ 延时5秒才返回页面
http://127.0.0.1/Less-9/?id=1 ”and sleep(5) --+ 直接返回页面
所以我们判断该sql查询语句为
Select * from tables where id = ‘numbei’
单引号类型的查询语句
把上一节课的语句拿出来,通过if和sleep来构造
http://127.0.0.1/Less-9/?id=1' and (select if((select ascii(substr(database(),1,1))=115),sleep(10),null)) --+
115 对应的是数据库security的首字母‘s’,所以我们测试的时候,整个页面缓冲了10秒
所以,根据上面的结果
我们就可以参照上一课的盲注,利用猜测ascii的方式,来判断数据库名,表名,字段名
比如
我们猜测 当前数据库的第一个字符的ascii的值大于116
http://127.0.0.1/Less-9/?id=1' and (select if((select ascii(substr(database(),1,1))>116),sleep(10),null)) --+
执行该语句后,因为有if语句的判断,判断结果是错误的,所以返回空,页面会直接返回,那说明我们的猜测是错的
我们再猜测
http://127.0.0.1/Less-9/?id=1' and (select if((select ascii(substr(database(),1,1))>114),sleep(10),null)) --+
执行该语句后,因为有if语句的判断,判断结果是正确的,所以执行sleep(10),页面会延时10秒再返回,所以我们的猜测是对的
我们猜测当前数据库的ascii码值为114 和116之间
我们再继续猜测,就能得出正确的ascii码了,也就知道正确的字符了
余下的查询表名和字段名,除了多加if和sleep两个函数,其余的就跟上一节课一样的了,这里就不再阐述。
这节演示的是第九关卡的,其实第十关卡的跟这一节几乎是一样的,除了sql查询语句是双引号类型这点不同而已。
Select * from tables where id = “numbei”
我们构造的语句只要能把双引号闭合,剩下的就都是一样的了。
所以第十关卡就不再另外讲解了。
同样的,只要我们能正确判断出该页面存在的是哪一种类型的sql注入,我们就可以借助sqlmap去处理,省事省力。