讓你的SQL盲注快起來

SQL 注入是當前 Web 安全中最常見的安全問題之一,其危害性也比較大,眾多白帽子在滲透測試過程中往往會首先著重進行 SQL 注入的測試。盲注是 SQL 注入的重要的技術之一,在現實中的 SQL 注入案例中,往往很難將注入的結果直接回顯出來。因此,盲注也就成為了 SQL 注入必不可少的手段之一。本文想分享一個如何大大提升盲注效率的技巧。

與或運算

與或運算,操作符分別為 & 以及 |,大多數人應該會在實際開發過程中很少使用到與或運算。如果你之前學過電腦組成原理,裡面講了很多關於補碼、反碼以及各種運算。當然,我們這裡不需要理解那麼多知識,這裡我們只需要理解與或運算就可以了。

與運算

運算規則:0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1

即:兩位同時為「1」,結果才為「1」,否則為0

或運算

運算規則:0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1

即:參加運算的兩個對象只要有一個為1,其值為1

假設參與運算的2個數據,一個數據是1,那麼另外一個的值就可以確定了,假設另外一個值為 x:

1 & x = 0, x = 0 1 & x = 1, x = 1

所以通過與運算,假設其中的一個數據是已知的,那麼另外的值就很好確定了。

通過與運算盲注

看到這裡,你可能還是一頭霧水,與運算和盲注有啥關係?假設一個數字 104,我們可以將它轉化為二進位,即 104 = 64 + 32 + 8 = 2 ^ 6 + 2 ^ 5 + 2 ^ 3,我們可以將它以比特位的形式將它表示出來:

那麼我們可以將104與1,2,4,8,16,32,64,128進行與運算,就可以獲得每個比特位上的數據。

與1進行運算

和2進行與運算

和4進行與運算

通過這樣的方式,我們就可以確定104每個比特位上的數據是什麼。那這和我們SQL盲注又有什麼關係呢?對於SQL盲注,我們往往會使用到 substring,我們會對結果的每一個字元來進行枚舉,將字元與可能字元來進行比較,這樣枚舉的效率可能會不太好,往往需要比較很多次。對於一個 acsii 字元,其範圍是在0-127之間,那麼只需要7個比特位就足夠了。那麼如果使用與運算的方式,我們只需要比較7次就可以確定這個字元的 ascii 碼。通過與運算的方式,可以顯著地提高效率,減少比較次數,而且往往字元越多,提升的效果就越明顯。

Talk is cheap, show me the code. 這裡我們通過 python 的方式來實現:

def compute_by_and(word):      for ele in word:          ele_b, times = get_character(ele)          print(f"Guess the value {ele_b}:{chr(ele_b)} with {times} times")  def get_character(char):      char_b = ord(char)      value = 0      times = 0      for i in range(7):          times = times + 1          if char_b & (2  i):              value = value + (2  i)      return value, times  if name == "main":      compute_bybinary("hello")

很明顯,每一個字元僅僅只需要7次比較就可以知道這個字元是什麼字元了。如果沒有數據支撐,這個結果可能對比不是很明顯,那我們可以通過其與普通的枚舉方式來進行對比,我們選取3個字元來進行對比,myapp,myappcard,myappcard_perform。我們枚舉的方式選取 string.printable,這個也包含了所有的 ascii 字元。

import string  def brute_force(word):      times = 0      for ele in word:          for c in string.printable:              times = times + 1              if ele == c:                  break      print(f"Brute force {word} with {times} times")  if name == "main":      brute_force("hello_world")

myapp

myapp_card

myappcardperform

枚舉

121

276

與運算

35

70

總結

通過上面的對比,我們可以看出在SQL盲注中,如果通過與運算來進行盲注,可以大大提升盲注的效率,減少請求的次數,這對於我們的測試的幫助意義還是比較大的

Tags: