sql盲注是sql注入的一种,它不会根据你的sql注入语句来返回你想要知道的错误信息。
盲注可分为两种:
因为数据库里的信息无法通过错误信息得到,所以只能通过盲注爆破猜解一个个字符值。
常见的猜解方法有三种:
通过遍历可打印字符串0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!'#$%&()*+,-./:;<=>?@[]^_{|}~
来猜解正确的字符值
效率分析:
T(n)=(n+1)/2,这里的n为可打印字符串的长度,这里n为91,则确定一个字符值的大小平均要比较运算46次
可打印字符的 ASCII码的值范围大概在0x20和0x7f区间内。
(1)首先取区间的中间值mid跟目标元素的ascii码值对比,如果相等则结束搜索。
(2)如果目标元素的ascii码值小于mid,则在小于mid的区间内查找,否则在大于mid的区间查找,重复(1)
(3)如果找不到则退出
效率分析:
T(n)=log2 n,n=0x7f-0x20=95,则确定一个字符平均比较次数为6.6次。
运算规则:
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盲注时,建议用二分法和与运算来猜解。