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