安全測試中sql注入測試思路
阿新 • • 發佈:2018-12-05
在找好需要測試的功能點之後,針對每種功能點(引數),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注入
- 若過濾判斷成功繞過過濾,但也沒有返回符合邏輯真假的結果,則不存在sql注入
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協議繞過。
- 若結果和id=6相同,則後臺存在資料型別轉換或非直接飲用引數,不存在sql注入