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

SQL Server 注入攻擊深度解析 (9/10):長度限制繞過、sp_password 審計繞過、二次注入與防禦策略

     編輯:關於SqlServer

長度限制並非萬能盾牌

輸入長度限制 (如用戶名 16 字元、密碼 16 字元) 可阻擋部分長 Payload,但**極短惡意語句**同樣毀滅性:


-- 僅 12 字元即可關閉 SQL Server
';shutdown--

-- DROP TABLE 亦極短
drop table users

截斷順序導致的繞過 (經典 CVE 類漏洞)

場景:應用先 **清洗轉義** (單引號 → ``),**再截斷長度**。

  1. 用戶名輸入 16 字元:aaaaaaaaaaaaaaa' (末尾單引號)
  2. 清洗器轉義 → aaaaaaaaaaaaaa'' (17 字元,雙引號)
  3. 截斷至 16 字元 → aaaaaaaaaaaaaa' (單引號**倖存**!)
  4. 密碼輸入:'; shutdown--
  5. 最終 SQL:

SELECT * FROM Users 
WHERE Username = 'aaaaaaaaaaaaaa'' 
  AND Password = ''';shutdown--'

結果:`Username` 變為 `aaaaaaaaaaaaaa' AND Password='`,後接 `shutdown` 執行。

**修補**:**先截斷/驗證長度,再參數化**;或直接參數化 (長度由型別約束)。

sp_password 繞過 SQL Server 審計 (SQL Trace / Extended Events)

SQL Server 內建保護:若批次文本含 `sp_password`,**整個批次文本在審計日志中被替換為註釋** (為隱藏明文密碼)。


-- 攻擊者利用此特性隱藏注入
Username: admin'--sp_password
-- 審計日志只見
-- 'sp_password' was found in the text of this event. The text has been replaced...
-- 實際執行的注入 SQL 被隱藏

**對策**:

  • 審計設定捕獲 **參數值** (Extended Events `sql_batch_completed` + `parameterized_sql_text` / `sql_statement_completed`)。
  • 監控 **行為異常** (非預期的 `shutdown`、結構變更、權限提升) 而非依賴 SQL 文本關鍵字。
  • 部署 **Database Firewall / RASP** 解析語義而非關鍵字匹配。

二次注入 — 最隱蔽的攻擊

  1. **注入階段**:攻擊者透過正常業務 (註冊、留言、檔案上傳元數據) 將惡意 Payload 存入資料庫 (如用戶名 `admin'--`)。系統正確轉義/參數化存入,資料庫實際值為 `admin''--`。
  2. **觸發階段**:另一功能 (如修改密碼、匯出報表、管理後台) **從資料庫讀取該欄位,直接拼接進動態 SQL** 執行。
  3. **爆發**:Payload 重新進入 SQL 引擎執行。

-- 階段 1: 註冊 (參數化存入安全)
Username: admin'--  →  資料庫存 'admin''--'

-- 階段 2: 修改密碼頁面 (脆弱代碼)
var sql = "UPDATE Users SET Pass='" + newPass + "' WHERE User='" + dbUser.UserName + "'";
-- dbUser.UserName 來自資料庫,值為 admin''--
-- 執行 SQL:
UPDATE Users SET Pass='new' WHERE User='admin''--'
-- 等同: UPDATE Users SET Pass='new' WHERE User='admin' -- 註釋掉尾部單引號
-- 成功竄改 admin 密碼!

根治二次注入的鐵律

  1. **所有進入 SQL 的資料皆不可信** — 無論來源 (用戶輸入、資料庫讀取、檔案、API 回傳)。
  2. **全鏈路參數化查詢** — 含動態 SQL 建構處 (`sp_executesql` + 參數)。
  3. **資料庫欄位加約束** — 如 `CHECK (UserName NOT LIKE '%--%')` 輔助攔截 (非替代方案)。
  4. **代碼審計掃描** — 專掃「字串拼接 SQL」模式,含變數來源追蹤。

防禦策略總結 (第 9-10 部分合併)

層面核心措施工具/技術
代碼層參數化查詢 (唯一根治)SqlParameter, PreparedStatement, ORM (EF/Dapper)
輸入層白名單驗證 (型別/長度/格式/範圍)FluentValidation, DataAnnotations, 正則
資料庫層最小權限帳號、移除危險擴展、審計GRANT 最小權限, sp_dropextendedproc, SQL Audit
網路層WAF/RASP、防火牆限制來源ModSecurity, OpenRASP, 云 WAF
運維層錯誤不外露、日志審計、滲透測試SIEM, 紅隊演練, 代碼掃描 (SAST/DAST)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved