原因
在套用
程式中若有下列狀況,則可能套用程式正暴露在SQL Injection的高風險情況下:
4.太過於信任使用者所輸入的資料,未限制輸入的字元數,以及未對使用者輸入的資料做潛在指令的檢查。
作用原理
1.SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字元為不同命令的區別。(原本的作用是用於SubQuery或作為查詢、插入、更新、刪除……等的條件式)
2.SQL命令對於傳入的字串參數是用單引號字元所包起來。《但連續2個單引號字元,在SQL
資料庫中,則視為字串中的一個單引號字元》
3.SQL命令中,可以注入註解《連續2個減號字元——後的文字為註解,或“/*”與“*/”所包起來的文字為註解》
4.因此,如果在組合SQL的命令字串時,未針對單引號字元作取代處理的話,將導致該
字元變數在填入命令字串時,被惡意竄改原本的SQL語法的作用。
可能造成的危害
1.資料表中的資料外泄,例如個人機密資料,帳戶資料,密碼等。
2.數據結構被
黑客探知,得以做進一步攻擊(例如SELECT * FROM sys.tables)。
3.
資料庫伺服器被攻擊,
系統管理員帳戶被竄改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
4.取得系統較高許可權後,有可能得以在網頁加入惡意連結以及
XSS。
5.經由
資料庫伺服器提供的作業系統支援,讓
黑客得以修改或控制作業系統(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服務)。
6.破壞硬碟資料,癱瘓全系統(例如xp_cmdshell "FORMAT C:")。
避免方法
1.在設計套用
程式時,完全使用
參數化查詢(Parameterized Query)來設計資料存取功能。
2.在組合SQL字串時,先針對所傳入的參數作字元取代(將單引號字元取代為連續2個單引號字元)。
3.如果使用
PHP開發網頁
程式的話,亦可開啟PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字元取代為連續2個單引號字元)。