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

SQL Server 注入攻擊深度解析 (10/10):輸入驗證策略、長度限制繞過、審核繞過與防禦體系建設

     編輯:關於SqlServer

輸入驗證三大流派

策略做法優點缺點/風險
1. 清洗/轉義單引號雙寫 ''、移除危險字元簡單、相容舊碼**黑名單永遠不全**;新攻擊向量繞過;二次注入風險 (資料入庫後再用)
2. 拒絕已知惡意黑名單檢測 select, union, --, drop 等攔截明顯攻擊繞過技巧多 (大小寫、編碼、註釋切分);誤殺正常業務 (如「select」作為產品名)
3. 只允許已知合法 (白名單)正則/型別驗證:如帳號 `^[a-zA-Z0-9_]{6,20}$`**最安全**,從源頭切斷業務複雜時難以定義完整白名單 (如人名含撇號 O'Brien)

最佳實踐:白名單 + 黑名單 混合防禦

  1. **參數化查詢** (PreparedStatement / SqlParameter) — **根治注入的銀彈**,資料與代碼分離。
  2. **輸入端白名單驗證**:型別、長度、格式、範圍 (前端 + 後端雙重)。
  3. **業務層語意驗證**:如「轉帳金額 > 0 且 ≤ 餘額」。
  4. **資料庫端最小權限**:應用帳號僅擁有必要表的 SELECT/INSERT/UPDATE/DELETE,**無 DDL、無 xp_cmdshell、無 sysadmin**。
  5. **錯誤資訊不外露**:生產環境關閉詳細錯誤頁,記錄至日誌供審計。
  6. **WAF / RASP** 作為第二道防線,攔截已知攻擊特徵。

經典繞過案例與對策

1. 單引號散布繞過清洗器


-- 攻擊者輸入 (清洗器只刪除單引號)
uni'on sel'ect @@version--
-- 清洗後變成
union select @@version--

**對策**:參數化查詢 (根治);若必須拼接,用**白名單字元集**而非黑名單刪除。

2. 長度截斷繞過

限制 16 字元,清洗器在截斷**前**加單引號,截斷**後**單引號消失:


-- 用戶名 (16字元限制)
aaaaaaaaaaaaaaa'  -- 16字元,末尾單引號被清洗器轉義為 ''
-- 密碼
'; shutdown--      -- 開頭單引號閉合上方轉義後的單引號,執行 shutdown
-- 最終 SQL
SELECT * FROM Users WHERE Username='aaaaaaaaaaaaaa'' AND Password=''';shutdown--'

**對策**:**先截斷/驗證長度,再清洗/參數化**;或直接用參數化查詢 (長度由資料庫型別約束)。

3. sp_password 繞過審計追蹤


-- 攻擊者在註釋後附加
admin'--sp_password
-- 審計日志只記錄
-- 'sp_password' was found in the text of this event. The text has been replaced...
-- 實際注入 SQL 被隱藏

**對策**:審計設定記錄**參數化查詢的參數值** (Extended Events / SQL Audit) 而非僅批次文本;監控異常登入/權限提升行為而非依賴 SQL 文本。

4. 二次注入 (Stored Injection)

  1. 攻擊者註冊用戶名 admin'--,系統轉義存入 admin''--。
  2. 用戶修改密碼頁面,代碼:UPDATE Users SET Pass='new' WHERE User=''+从数据库读取的UserName+''。
  3. 執行變為:UPDATE Users SET Pass='new' WHERE User='admin'--' → 竄改 admin 密碼。

**對策**:**所有進入 SQL 的資料 (含從資料庫讀出的) 皆視為不可信**,統一參數化;或對資料庫欄位加約束/觸發器禁止特殊字元。

SQL Server 硬化清單 (生產環境必做)

  1. 網路庫最小化:關閉 Named Pipes、Via,僅啟用 TCP/IP;防火牆限制來源 IP。
  2. 帳號最小權限:刪除 `sa`、內建帳號;應用用專用低權限 SQL 登入 / Windows 網域帳號;啟用強制密碼策略。
  3. 移除風險擴展預存程序:`xp_cmdshell`, `xp_regread`, `xp_regwrite`, `xp_servicecontrol`, `sp_OA*` 等 — **若業務不用,徹底刪除 (sp_dropextendedproc) 或刪除 DLL**。
  4. 刪除範例資料庫:`Northwind`, `pubs`。
  5. 修補程式保持最新:定期套用 CU/GDR,關注 CVE (如 CVE-2023-XXXX 緩衝區溢位)。
  6. 審計與日志:啟用 SQL Server Audit (登入失敗、結構變更、權限變更、敏感表存取) → 寫入安全日志 / SIEM。
  7. 加密傳輸:強制 TLS 1.2+ (Force Encryption = Yes)。
  8. 資料庫層面:啟用 `TRUSTWORTHY OFF`、`DB_CHAINING OFF`、`CROSS_DB_OWNERSHIP_CHAINING OFF`。

總結:防禦深度 (Defense in Depth)

**單一防線必失效**。參數化查詢 (代碼層) + 最小權限 (資料庫層) + 輸入驗證 (應用層) + WAF/RASP (網路層) + 審計監控 (運維層) + 定期滲透測試 = 可控風險。**注入漏洞本質是「資料與代碼未分離」,參數化查詢是唯一徹底根治方案,其他皆為輔助緩解。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved