sleep(n)
??: 核心延時函數。使數據庫程序暫停?n
秒。
??if(condition, true_expr, false_expr)
??: 條件判斷函數。如果?condition
為真,執行?true_expr
,否則執行?false_expr
。??用于將延時與判斷條件綁定??。
??mid(a, b, c)
??: 字符串截取函數。從字符串?a
的第?b
位開始,截取?c
個字符長度的子串。
通過觀察網頁響應時間是否延遲了5秒,從而判斷出數據庫名字的第一個字母不是 'g',這里返回5,不是g
??substr(a, b, c)
??: 功能同?mid(a, b, c)
,字符串截取函數。
?left(a, b)
??: 字符串截取函數。從字符串?a
的??左側??截取前?b
位
database()
??: 返回當前數據庫的名稱。
length(a)
??: 返回字符串?a
的長度。
攻擊原理:
通過組合上述函數,構造一個條件判斷(如?if(ascii(substr(database(),1,1))=100, sleep(5), 0)
),如果條件為真,則觸發延時,從而根據頁面的響應時間來判斷猜測的數據是否正確。這是一種“盲注”手段,在無法直接看到查詢結果時使用。
如果當前數據庫名的第一個字母是 't',那么就讓數據庫睡眠0秒(不延遲);否則,就睡眠5秒(產生明顯延遲)。
?id=1 and sleep(if(mid(database(),1,1)='t',0,5))
在SQL注入過程中,推薦使用ASCII碼進行判斷。???
1.防止引號轉義??:可以避免因單引號?'
或雙引號?"
被應用程序轉義或過濾而導致的注入失敗,提高攻擊的成功率和可靠性。
2.方便工具使用??:為后續使用sqlmap
等自動化注入工具提供便利,這些工具通常采用ASCII碼值進行盲注判斷,手動測試時采用同樣方法可以保持一致。
從當前數據庫中查詢第一張表的表名,并取出其第一個字符。如果這個字符的ASCII碼等于116(即字符't'),那么就讓數據庫睡眠2秒;否則,就不睡眠。
select * from t1 where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=116,sleep(2),0);