基於時間型SQL盲注


1 基於時間型SQL盲注

注入SQL 代碼之后, 存在以下兩種情況:

  • 如果注入的SQL代碼不影響后台[ 數據庫] 的正常功能執行, 那么Web 應用的頁面顯示正確( 原始頁面) 。
  • 如果注入的SQL 代碼影響后台數據庫的正常功能( 產生了SQL 注入) , 但是此時Web 應用的頁面依舊顯示正常( 原因是Web 應用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。

產生一個疑問: 注入的SQL 代碼到底被后台數據庫執行了沒有? 即web 應用程序是否存在SQL 注入?
面對這種情況, 之前講的基於布爾的SQL 盲注很難發揮作用了( 因為基於布爾的SQL 盲注的前提是web 程序返回的頁面存在true 和false 兩種不同的頁面) 。這時, 一般采用基於web 應用響應時間上的差異來判斷是否存在SQL 注入, 即基於時間型SQL 盲注。

1.1 sleep()函數——延時函數

在MySQL中, sleep() 函數語法如下:

sleep(seconds) ,即sleep() 函數代碼執行延遲若干秒。 Sleep() 函數執行是有條件的,必須保障sql語句執行結果存在數據記錄才會停止指定的秒數,如果sql 語句查詢結果為空,那么sleep() 函數不會停止。 S1eep 函數執行停留后,執行后返回值為0

 

 通過邏輯判斷控制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,從而猜解一些未知的字段。

注入流程(以獲取數據庫版本信息為例):

  1.  確定注入點及注入類型
  2.  使用if判斷語句,猜測version()的長度並用sleep函數作為判斷依據
  3.  重復步驟2直至獲取真正長度
  4.  使用if判斷語句,猜測version()的第一個字符的ascii碼並使用sleep函數作為判斷依據構造注入語句,
  5.  重復步驟4,直至獲取全部長度的版本字符的ascii碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM