MySQL SLEEP函數
SLEEP() // Sleep for a number of seconds
Sleeps (pauses) for the number of seconds given by the duration argument, then returns 0. The duration may have a fractional part. If the argument is NULL or negative, SLEEP() produces a warning, or an error in strict SQL mode.
(http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_sleep)
SQL Injection
第一次用到這函數竟是在模擬SQL Injection鎖表攻擊語法,來個範例:
select * from Table where id=500 OR SLEEP(5);
OR SLEEP()
意即每Row都執行,以下情況即會見效:
MyISAM這種Lock Table機制,SLEEP()
打主Table足夠,一般情況下進而使PHP Thread過多造成502見效。
# SQL Injection 使用範例
select * from Table where username='nick';
如果該WEB的GET參數即為該username欄位,Value改為:
nick' OR SLEEP(5)-- Comment
即可達到SLEEP注入:
select * from Table where username='nick' OR SLEEP(5)-- Comment';
以上使用單引號範例達到考慮下註解排除原單引號,因為輸入值為數字開洞機會小,若真的組成SQL語句時沒做型態轉換那該Programer就真的...。
SQL 語法的註解
SQL 註解的語法有以下三種,不同的 SQL 版本,會吃不同的語法。
「/*」 MySQL
「--」 MsSQL
「#」 MySQL , # 對於 browser 來說是有意義的,那是錨點的意思,所有必須先透過 Url Encode 後的代碼 「%23」 來代替。