SQL Server 作為企業級關聯式資料庫,功能強大且與作業系統整合緊密,這雖然為開發帶來便利,但若配置不當或程式碼未經嚴格過濾,也可能成為攻擊者的跳板。本文將系統性梳理常見的 SQL Server 注入手法,並提供相應的防禦建議,旨在協助開發人員與資料庫管理員建立更安全的資料庫應用環境。
攻擊者常透過注入惡意 SQL 片段,嘗試呼叫系統預存程序或查詢系統表以獲取敏感資訊或提升權限。以下為幾類典型場景:
若資料庫連線使用的是 sa 等高權限帳號,攻擊者可嘗試注入類似 ;exec master..xp_cmdshell "net user ..." 的語句,透過分號分隔多條 SQL 指令,並利用註解符號 -- 忽略後續原始查詢。成功時可在作業系統層面建立帳號並加入管理員群組,進而取得伺服器最高控制權。
防禦重點: 原則上應避免應用程式使用 sa 連線;在 SQL Server 2005 及更新版本中,xp_cmdshell 預設為停用狀態,請務必維持此設定。
攻擊者常利用型別轉換錯誤,將查詢結果強制轉換為整數以觸發錯誤訊息,從而洩露資料庫名稱(db_name())、資料表名稱(查詢 sysobjects)及欄位名稱(使用 col_name())。例如:
id=1;backup database [DB名] to disk='c:\inetpub\wwwroot\1.db';--
若能取得資料庫絕對路徑,攻擊者甚至可將整個資料庫備份至 Web 目錄並直接下載,導致所有帳號密碼洩露。
sysobjects 表儲存了所有使用者建立的資料表(xtype='U')。攻擊者可透過 TOP 1 逐筆提取資料表名,再利用 object_id() 與 col_name() 遞迴列舉欄位。
許多應用程式嘗試透過過濾單引號 ' 來防禦注入,但此手段極易被繞過:
CHAR() 或 NCHAR() 函式構造字串,如 WHERE xtype=CHAR(85) 替代 WHERE xtype='U';中文則可用 NCHAR(29992)+NCHAR(25143) 表示「使用者」。selecT、uPdATE 等混合大小寫關鍵字可能繞過攔截。+ 會被解析為空格,%2B 為 +,%25 為 %,需熟悉 URLEncode 機制。sa 或具備 sysadmin 角色的帳號。xp_cmdshell、xp_regread 等)。SQL 注入漏洞雖歷經多年仍屬高發風險,但透過「參數化查詢 + 最小權限 + 錯誤資訊隱藏 + 持續監控」的纵深防禦體系,可將風險降至極低。安全與開發本質上相輔相成:深入理解攻擊原理,才能編寫出更健壯的程式碼。