[MySQL] SLEEP() 函數 – SQL Injection – MyISAM

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都執行,以下情況即會見效:

  • explicit lock table
  • insert/update/delete on MyISAM
  • ALTER table on InnoDB
  • 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」 來代替。

    Leave a Reply

    Your email address will not be published. Required fields are marked *