一、SQL注入攻擊(SQL Injection)
攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶(hù)輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。常見(jiàn)的SQL注入式攻擊過(guò)程類(lèi)如:
1.某個(gè)Web應(yīng)用有一個(gè)登錄頁(yè)面,這個(gè)登錄頁(yè)面控制著用戶(hù)是否有權(quán)訪問(wèn)應(yīng)用,它要求用戶(hù)輸入一個(gè)名稱(chēng)和密碼;
2.登錄頁(yè)面中輸入的內(nèi)容將直接用來(lái)構(gòu)造動(dòng)態(tài)的SQL命令,或者直接用作存儲(chǔ)過(guò)程的參數(shù);
例如:
$query = 'SELECT * from Users WHERE login = ' . $username . ' AND password = ' . $password;
3.攻擊者在用戶(hù)名字和密碼輸入框中輸入'或'1'='1之類(lèi)的內(nèi)容;
4.用戶(hù)輸入的內(nèi)容提交給服務(wù)器之后,服務(wù)器運(yùn)行上面的代碼構(gòu)造出查詢(xún)用戶(hù)的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:
SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1';
5.服務(wù)器執(zhí)行查詢(xún)或存儲(chǔ)過(guò)程,將用戶(hù)輸入的身份信息和服務(wù)器中保存的身份信息進(jìn)行對(duì)比;
6.由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶(hù)身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)給攻擊者。
如果攻擊者知道應(yīng)用會(huì)將表單中輸入的內(nèi)容直接用于驗(yàn)證身份的查詢(xún),他就會(huì)嘗試輸入某些特殊的SQL字符串篡改查詢(xún)改變其原來(lái)的功能,欺騙系統(tǒng)授予訪問(wèn)權(quán)限。
系統(tǒng)環(huán)境不同,攻擊者可能造成的損害也不同,這主要由應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)的安全權(quán)限決定。如果用戶(hù)的帳戶(hù)具有管理員或其他比較高級(jí)的權(quán)限,攻擊者就可能對(duì)數(shù)據(jù)庫(kù)的表執(zhí)行各種他想要做的操作,包括添加、刪除或更新數(shù)據(jù),甚至可能直接刪除表
防范方法:
1.檢查變量數(shù)據(jù)類(lèi)型和格式
2.過(guò)濾特殊符號(hào)
3.綁定變量,使用預(yù)處理語(yǔ)句