sql盲注的效率分析
2020-04-20 10:46:10 Author: xz.aliyun.com(查看原文) 阅读量:269 收藏

sql盲注是sql注入的一种,它不会根据你的sql注入语句来返回你想要知道的错误信息。

盲注可分为两种:

  • 布尔盲注: 根据注入语句返回Ture和False
  • 时间盲注: 界面的返回值只有True.加入特定的时间函数,查看web页面返回的时间差来判断注入语句的正确性。

因为数据库里的信息无法通过错误信息得到,所以只能通过盲注爆破猜解一个个字符值。
常见的猜解方法有三种:

  • 遍历法
  • 二分法
  • 与运算

1.遍历法

通过遍历可打印字符串0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!'#$%&()*+,-./:;<=>?@[]^_{|}~
来猜解正确的字符值

效率分析:

T(n)=(n+1)/2,这里的n为可打印字符串的长度,这里n为91,则确定一个字符值的大小平均要比较运算46次

2.二分法

可打印字符的 ASCII码的值范围大概在0x20和0x7f区间内。

(1)首先取区间的中间值mid跟目标元素的ascii码值对比,如果相等则结束搜索。
(2)如果目标元素的ascii码值小于mid,则在小于mid的区间内查找,否则在大于mid的区间查找,重复(1)
(3)如果找不到则退出

效率分析:

T(n)=log2 n,n=0x7f-0x20=95,则确定一个字符平均比较次数为6.6次。

3.与运算

运算规则:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

即:两位同时为 1,结果才为1,否则为0

一个byte有8bit,假设8bit的低位到高位的值a、b、c、d、e、f、g、h,并且其值只能为0,1两种,其值大小为
a*2^0+b*2^1+c*2^2+d*2^3+e*2^4+f*2^5+g*2^6+h*2^7。所以我们只要将其值大小分别于1,2,4,8,16,32,64,128进行与运算,就能够确定每bit位的值,从而猜出其值大小。对于可打印字符的值小于127,最高bit为为0,所以只要比较7次就行了。

效率分析:

T(n)=7,一个字符值大小需要比较7次确认。

 
 
 
从上面的效率分析中,遍历法需要平均比较46次,二分法需要平均比较6.6次,与运算需要7次,因为http请求的时间开销会相对大,因此http请求次数越少,花费的时间会越少,所以sql盲注的效率大小为

二分法>=与运算> 遍历法

这里拿HFSEC平台的一道sql盲注,分别用三种不同的解法来对比一下效率

遍历法


运算结果

40356E66E78BB1DC1EFBC04FA4336F59
spend time: 207.9748649597168

二分法


运行结果

40356E66E78BB1DC1EFBC04FA4336F59
spend time: 14.131437301635742

与运算

运算结果

40356E66E78BB1DC1EFBC04FA4336F59
spend time: 15.214633703231812

从三种的不同解法的运算结果时间来看,遍历法花费了207秒、二分法花费了14秒,与运算花费了15秒。花费的时间还会受到网速和其他因素的影响,不是每次运行都会花费相同的时间,但总的结果来说,遍历法花费的时间很多,二分法和与运算花费的时间比较少。 所以在遇到sql盲注时,建议用二分法和与运算来猜解。


文章来源: http://xz.aliyun.com/t/7575
如有侵权请联系:admin#unsafe.sh