Bool盲注通常是由于开发者将报错信息屏蔽而导致的,但是网页中真和假有着不同的回显,比如为真时返回access,为假时返回false;或者为真时返回正常页面,为假时跳转到错误页面等。

Bool盲注中通常会配套使用一些判断真假的语句来进行判定。常用的发现Bool盲住的方法是在输入点后面添加and 1=1和and 1=2(该Payload应在怀疑是整形注入的情况下使用)。

Bool盲注的原理是如果题目后端拼接了SQL语句,and 1=1为真时不会影响执行结果,但是and 1=2为假,页面则可能会没有正常的回显。

有时候我们可能会遇到将 1=1过滤掉的SQL注入点,这时候我们可以通过修改关键字来绕过过滤,比如将关键字修改为不常见的数值(如1352=1352等)。

在字符串型注入的时候我们还需要绕过单引号,将Payload修改为如下格式 'and' '1'='1'和'or' 1'='2来闭合单引号。

在盲注中,我们经常使用的函数有以下几种分类。

1.截取函数

函数名 功能及使用方法
substr() substr函数是字符串截取函数,在盲注中我们一般获取数据,这时候就需要使用substr函数按位截取。
使用方法:substr(str,start,length)。这里的str为被截取的字符串,start为开始截取的位置,length为截取的长度。
在盲注时,我们一般只截取一位,如substr(user(),1,1),这样可以从user函数返回数据的一位开始的偏移位置截取一位,
之后我们只要修改位置参数即可获取其他的数据
left() left函数是左截取函数,left的用法为left(str,length)。这里的str是被截取的字符串,length为被截取的长度。
在盲注中可以使用left(user(),1)来左截取一位字符。但是,如果是left(user(),2),则会将user()的前两位都截取出来,这样的话,
我们需要在匹配输出的字符串之前增加前缀,把之前几次的结果添加到这次的结果之前
使用样例如下:
假设user()函数返回的字符串是“admin”,那么
select a from b where left(a,1) = 'a'

会返回真,在探测第二位的时候,需要把第一位添加到当前探测位之前,比如:
select a from b where left(a,2) = 'ad'
以此类推,直到读取到全部内容为止
right() right函数是右截取函数。使用方法与left函数类似,可以参考left函数的用法
 

2.转换函数

函数名 功能及使用方法
ascii() ascii函数的作用是将字符串转换为ASCII码,这样我们就可以避免在Payload中出现单引号。
使用方法为ascii(char),这里的char为一个字符,在盲注中一般为单个字母。如果char为一串字符串,则返回
结果将是第一个字母的ASCII码。我们在使用中通常与substr函数相结合,如ascii(substr(user(),1,1)),这样可
以获得user()的第一位字符的ASCII码
hex() Hex函数可以将字符串的值转换为十六进制的值。在ascii函数被禁止时,或者是需要将二进制数据写入文件时
可以使用该函数,使用方法类似于ascii函数
 

3.比较函数

函数名 功能及使用方法
if() if函数是盲注中经常使用的函数,if函数的作用与1=1和1=2的原理类似。
如果我们要盲注的对象为假,则可以通过if的返回结果对页面进行控制。
使用方法为if(cond,Ture_result, False_result)其中,cond为判断条件,Ture_result为假时的返回结果。
使用样例如下:
?id=1 and 1=if(ascii(subsrt(user(),1,1)) =97,1,2)
如果user的第一位是'a'则将返回1,否则就返回2。然而,如果返回的是2,则会使and后的条件不成立,导致返回错误页面。
这时我们可以根据页面的长度进行判定,从而达到盲注的效果


注意:在盲注的题目及真实的渗透测试中,有时候使用sqlmap可能会存在误报。原因在于在一些数据返回页面及接口返回数据时可能会存在返回的是随机字符串(如,时间或防止CSRF的Token等)导致页面的长度发生变化的情况,这时候我们的工具及自动化检测脚本会出现误报。我们需要冷静地对Payload和返回结果进行分析。