Web渗透测试之SQL注入:Level8--布尔盲注

前言

  本篇以盲注为主题,略微涉及一点算法知识,简单介绍盲注定义及其类型,着重围绕布尔盲注进行讲解。

题目分析

题目页面如下:
题目首页
按照提示输入1,2,3等参数后页面基本一致:
输入参数后页面
输入单引号后虽然出错,但并没有将错误信息打印到页面:输入单引号结果
输入 'and ‘1’='1 与 'and ‘1’='2 后二者页面不一致,由此可确定存在注入漏洞且闭合符应为单引号:
逻辑验证
  进行到这一步你感到非常憋屈,网站既没有把查询结果直接返回到页面,也没有把错误信息打印出来,这让你引以为傲地联合查询注入和报错注入都失去了用武之地。思来想去,这种情境下只能采用盲注了。但对于盲注,尤其是手工盲注,你可谓极不情愿。那为何会不情愿呢?

盲注

定义

  所谓的盲注,重点就在一个“盲”字。因为没有直接返回查询结果或者错误信息,因此要想获得我们需要的信息,只能通过一次次盲目地、不确定地注入尝试,再根据一些表征来获得我们想要的信息。通过一次次的尝试直至获得我们想要的信息的过程,就是盲注。

盲注类型

  传统意义上的SQL盲注由用来判断的表征不同,可以分为布尔盲注时间盲注两类。但盲注本身的性质决定了短时间内将进行产生多次SQL注入尝试,所以极其容易被WAF发现并禁止该IP访问。因此在现代SQL盲注中最常使用的是利用查看DNSlog的方式进行盲注。本篇讲解的为布尔盲注,随后两篇将依次讲解时间盲注和DNSlog辅助盲注。

布尔盲注

  在讲布尔盲注之前先假设如下情景:你正在跟一个人进行交流,这个人除了能看懂你写的字和点头摇头以外,无法调用其它感官投入到交流之中,那么这个人要如何对你表达他想说的话呢?首先因为这个人能看,所以你可以先在纸上写个字让他看,然后让他通过点头或摇头的方式确认想表达的第一个字是不是这个字。由于字是有限个的,因此通过枚举不断尝试可以确定第一个字,最终得出这个人想要表达的整句话。同样地在布尔盲注中,我们也只能通过返回的true和fault来判断SQL语句的执行情况以拼凑出我们想要的信息。
  以得到数据库名为例:要想得到库名,先决条件就是知道库名到底由多长,如果没有先确定库名长度就直接开始枚举库名中的字符,将会浪费极大的时间。假设库名为abc,第三位的字符c枚举成功后,由于不知道库名长度,你将会继续枚举,直至所有合法字符枚举完之后你才会发现原来库名长度只有3。所以提前知道字符长度将会极大的节省时间精力。
  在知道库名多长之后,怎么确定每个字符呢?因为计算机存储的是一堆二进制的数,所以这里采用比较ASCII码是否相等的方式确定字符

布尔盲注常用函数

以下是布尔盲注常用的函数:
length():获得字符串长度;
substr():截取指定字符串;
ascii():将字符转为ASCII码;

二分查找法

  在正式注入前先简单介绍下二分查找法的思想。所谓的二分查找,就是在有序队列中(现假设为从小到大排列且想查找的数在队列中)先找到中间数,再将想查找的数与中间数进行比较,如果比中间数大,就以该有序队列的后半段为一个新的队列重新寻找中间值,然后重新进行比较……一直重复此操作直至找到目标。
  二分查找法的时间复杂度为o(log n),顺序查找法时间复杂度为o(n),所以在面对海量数据时二分查找法的效率是明显优于顺序查找法的。渗透测试虽然不需要算法知识,但难免会遇到自己写脚本的时候,因此了解一些经典的算法是有利于提高脚本运行效率的。

注入示例

  按照刚才的分析,先确定库名长度。这数据库命名就好比人取名字,长度一般不会太长,大概10个字符左右,因此先将查询到的长度跟10比较,语句如下:
'and length(database())>10 - -+
结果如下:
是否大于10
  页面错误,因此库名长度应小于10,接着按照二分法的思想,找到新的中间数5(int((1+10)/2),即首尾相加除二再向下取整)继续比较:
'and length(database())>5 - -+
结果如下:
大于5正确
  页面正确,因此库名长度应大于5小于10……不断重复最终确定库名长度应为8:
'and length(database())=8 - -+
结果如下:
长度等于8
  接下来就是逐个确定每个字符。数据库命名规范中要求库名必须由小写字母和下划线组成,下滑线不能作为开头字符。a-z对应ASCII码为:97-122下划线ASCII码为:95。按照二分法的思想,先对比109.语句如下:
'and ascii(substr(database(),1,1))>109 - -+
确定第一个字符
  页面返回正确,表明第一个字符ASCII码大于109不超过122……不断重复可确定第一个字符为s,剩下的字符处理方式同理。最终确定库名结果为security。

总结

  在布尔盲注中要想获得我们想要的信息,应该先确定字符长度,接着通过对比ASCII码的方式确定每一个字符,最终得出完整的信息。
  以上就是本篇的全部内容,我们下篇见。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值