1. 程式人生 > >安全測試中sql注入測試思路

安全測試中sql注入測試思路

在找好需要測試的功能點之後,針對每種功能點(引數),sql注入測試一般遵循下面步驟:
1. 測試注入型別,數字型or字元型

  • 如果引數中直接包含字母,那麼直接可以判斷是字元型引數,如id=4a。

  • 若引數是數字通常可以考慮輸入表示式來判斷,如id=6,可嘗試輸入id=7-1或id=3*2

    • 如果返回結果和id=6相同,可以確認為數字,進行2. 邏輯判斷
    • 若返回空,可進一步測試是否為字元型或是否有過濾。在引數後加單引號,如id=6’
      • 若出現了資料庫報錯,那麼極大可能存在字元型sql注入,直接進行2.邏輯測試。
      • 如果返回空或正常,則進行4. 過濾判斷

2. 測試邏輯語句

  • 以邏輯真和邏輯假共同測試,形如:
id=6' and 1=1 -- 
id=6' and '1'='1
id=6' and 1=2 --
id=6' and '1'='2
//如果是數字型注入,那麼id=6'後的單引號省略
  • 根據實際情況來判斷是否需要拼接語句,拼接方法也因地制宜
    • 若邏輯真返回結果和id=6結果相同,邏輯假返回空,則可以判斷存在sql注入
    • 若邏輯真和邏輯加返回結果都和id=6結果相同或都為空,則進行4. 過濾判斷
      • 若過濾判斷成功繞過過濾,但也沒有返回符合邏輯真假的結果,則不存在sql注入
        或進行3. 延時判斷

3. 測試延時語句

  • 在一些情況下,可根據個人判斷,假如一個頁面的返回結果可能和引數無關,也就是說,引數的查詢結果或語句報錯都不會影響頁面的返回的情況下,可以嘗試延時注入,如id=6 and sleep(5) –
    • 若成功延時返回,則說明存在sql注入
    • 若沒成功延時,則進行4. 過濾判斷
      • 過濾測試若成功繞過,也沒有觸發延時,則不存在sql注入

4. 測試有無過濾策略

  • 下面測試僅針對“過濾”,如被“攔截”比較明顯,無需測試。首先進行fuzz測試,輸入如id=6asidji
    • 若結果和id=6相同,則後臺存在資料型別轉換或非直接飲用引數,不存在sql注入
    • 若返回結果空則進行特殊單詞過濾檢測,如id=6and,id=6sleep(5),id=6’等
      • 若返回結果和id=6相同,說明目標單詞被過濾,嘗試替換繞過後繼續測試,若找不到繞過方式,懷疑為白名單或無法繞過,可認為不存在sql注入
      • 若返回結果為空,則說明沒有被過濾,嘗試單詞組合,如id=6 and(這句話測試空格和and的組合,還有其他組合,具體組合方式因地制宜,無需構造完整的sql語句)
        • 若返回結果和id=6相同,則被過濾,嘗試替換繞過後繼續測試,若找不到繞過方式,懷疑為白名單或無法繞過,可認為不存在sql注入
        • 若返回結果為空,則說明不存在過濾,進行更多的組合測試,若沒發現過濾,那麼結合之前的1. 2. 3.三步測試結果(一定是前三步沒有收穫才會進行這一步)可得出結論不存在sql注入
        • 根據實際情況進行http協議層面的繞過,如測試中目標開啟了waf,懷疑被waf過濾,那麼可嘗試http協議繞過。