1 基於時間型SQL盲注
注入SQL 代碼之后, 存在以下兩種情況:
- 如果注入的SQL代碼不影響后台[ 數據庫] 的正常功能執行, 那么Web 應用的頁面顯示正確( 原始頁面) 。
- 如果注入的SQL 代碼影響后台數據庫的正常功能( 產生了SQL 注入) , 但是此時Web 應用的頁面依舊顯示正常( 原因是Web 應用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。
產生一個疑問: 注入的SQL 代碼到底被后台數據庫執行了沒有? 即web 應用程序是否存在SQL 注入?
面對這種情況, 之前講的基於布爾的SQL 盲注很難發揮作用了( 因為基於布爾的SQL 盲注的前提是web 程序返回的頁面存在true 和false 兩種不同的頁面) 。這時, 一般采用基於web 應用響應時間上的差異來判斷是否存在SQL 注入, 即基於時間型SQL 盲注。
1.1 sleep()函數——延時函數

通過邏輯判斷控制sleep()函數的執行

1.2 邏輯判斷函數if()
在基於時間型SQL盲注中, 經常使用條件語句來判斷操作是否正確:
if condition then do_someing else do_something_elsell 即如果某條件發生, 那么執行語句一, 否則, 執行語句二
在MySQL中, if () 函數語法如下:
- IF(expr1 ,expr2 ,expr3) 如果expr1 為真, 則IF() 函數執行expr2 語句; 否則IF() 函數執行expr3 語句。
輸入:
- select user from users where user_id=1 and1=if(ascii (substr(database(),11))>1,sleep(5),1); //這里如果條件ascii (substr(database(),11))>1成立, 則執行sleep(5) , 否則執行1

1.3 BENCHMARK()函數
在MySQL中, BENCHMARK()函數語法如下:
BENCHMARK(count,expr) 即BENCHMARK()函數重復執行表達式expr count 次,實際表現就是查詢延遲。可配合if 函數,實現延遲的注入判斷。
構造輸入如下:
- select user from users where user_id=1 union select if (ascii (substring(database(),1,1))>100,BENCHMARK(500000000,encode('MSG' ,'by 5 seconds' )),1);

1.4 注入思路:
基於時間盲注的一般思路是延遲注入,說白了就是利用sleep()或benchmark()等函數讓mysql執行時間變長並結合判斷條件語句if(expr1,expr2,expr3),然后通過頁面的響應時間長短來判斷語句返回的值是TRUE還是False,從而猜解一些未知的字段。
注入流程(以獲取數據庫版本信息為例):
- 確定注入點及注入類型
- 使用if判斷語句,猜測version()的長度並用sleep函數作為判斷依據
- 重復步驟2直至獲取真正長度
- 使用if判斷語句,猜測version()的第一個字符的ascii碼並使用sleep函數作為判斷依據構造注入語句,
- 重復步驟4,直至獲取全部長度的版本字符的ascii碼
