數據庫mysql注入sleep語句引發的拒絕服務及修復方案mysql存在注入,并且注入的sleep語句如果傳入一個足夠大的參數,比如:sleep(9999999999).
如果數據庫用的是myisam引擎,且注入點是某個會鎖表的語句(insert,replace,update,delete),那么整個數據表的訪問都會被阻塞。
使用該表的所有應用的讀庫請求都會被阻塞。
如果數據庫使用的是主從分離的架構,www.2cto.com 那么Master和Slave的同步會被sleep語句阻塞,導致從庫無法從主庫正常同步數據。一些依賴于主從同步的應用也會無法正常工作。
就算僅僅是讀操作,經過有限次的請求,也會很快的達到數據庫的max_connections限制,而導致數據庫拒絕服務。
漏洞證明:
注入語句update test_inj set xx=1 and sleep(9999999999);
mysql> select * from test_inj;
請求會被阻塞。直到手動殺死那個鎖表的語句。
線上實驗后果會比較嚴重,就不貼真實的例子了。測試者請用自己搭建的數據庫。不要害人。
修復方案:
禁用mysql的sleep函數。或者修改它的sleep上限,拒絕不合理的超長sleep。現實中很少用到這個sleep功能,就算遇到需要sleep的場景,也可以通過外部應用來實現sleep。