SQL Server 2005 及之後的版本
02背景xp_cmdshell 是一個很危險的存儲過程,通過它,可以通路作業系統的資源,但有時候我們也需要使用它來實作一些特殊的處理。
從安全的角度來考慮,禁用 xp_cmdsehll 是最保險的,即使為了特殊目的而要求使用它,也最好能夠編寫一些實作這個特殊目的的使用者存儲過程,隻在這個使用者存儲過程中使用 xp_cmdshell,而普通使用者隻能使用這些使用者存儲過程。
03正确的解決辦法下面的示例顯示如何使普通使用者在不具有執行存儲過程 xp_cmdshell 的權限下,調用包含了執行 xp_cmdshell 代碼的使用者存儲過程的方法。
具有執行xp_cmdshell權限的登入USE master;
GO
-- 1.a. 建立登入
CREATE LOGIN Cmd_Login
WITH PASSWORD = N'Pwd.123',
CHECK_POLICY = OFF;
-- 1.b. 這個登入是内置的, 不允許登入, 這樣可以減少安全隐藏
DENY CONNECT SQL
TO Cmd_Login;
-- 1.c. 因為要調用xp_cmdshell , 是以在master 中要有使用者, 并具有權限
CREATE USER Cmd_Login
FOR LOGIN Cmd_Login
WITH DEFAULT_SCHEMA = dbo;
GRANT EXECUTE ON sys.xp_cmdshell
使用者資料庫USE tempdb;
-- 2.a 為執行xp_cmdshell 權限的登入建立使用者
-- 2.b 測試存儲過程
CREATE PROC dbo.p
WITH EXECUTE AS N'Cmd_Login' -- 指定存儲過程的執行時的上下文
AS
EXEC master.sys.xp_cmdshell 'dir c:/'
調用存儲過程的普通登入-- 3.a 登入
CREATE LOGIN test
WITH PASSWORD = N'abc.123',
-- 3.b 資料庫使用者
CREATE USER test
FOR LOGIN test;
-- 3.c 執行存儲過程的權限
GRANT EXECUTE ON dbo.p
TO test;
-- 3.d 執行測試
EXECUTE AS LOGIN = N'test';
EXEC dbo.p;
REVERT;
-- 4. 删除測試
DROP PROC dbo.p;
DROP USER test;
DROP USER Cmd_Login;
DROP LOGIN test;
DROP LOGIN Cmd_Login;
04補充說明多數情況下,資料庫的所有者是 sa 一類的 sysadmin 固定伺服器角色的成員,是以在這種情況下,也可以直接指定使用資料庫所有者作為存儲過程執行的安全上下文。
使用者的資料庫WITH EXECUTE AS N'dbo' -- 指定存儲過程的執行時的上下文
-- 3.a 登
删除測試使用前述方法的時候,執行個體中需要有 xp_cmdshel l代理帳戶(預設是沒有的), 否則會收到下面的錯誤資訊。
消息15153,級别16,狀态1,過程xp_cmdshell,第1 行xp_cmdshell 代理帳戶資訊無法檢索或無效。請驗證'##xp_cmdshell_proxy_account##' 憑據存在并且包含有效的資訊。
可以使用下面的代碼建立xp_cmdshell代理帳戶。
DECLARE
@user sysname,
@password sysname,
@sql varchar(1000);
-- 在作業系統中為xp_cmdshell 代理帳戶建立windows 使用者
SELECT
@user = N'XpCmdAccount',
@password = N'P@ssw0rd.',
@sql = 'NET USER "' + @user + '" "' + @password + '" /ADD';
EXEC sys.xp_cmdshell @sql;
-- 建立xp_cmdshell 代理帳戶
@user = CONVERT(sysname, SERVERPROPERTY(N'MachineName'))
+ N'/' + @user;
EXEC sp_xp_cmdshell_proxy_account @user, @password;
最後說明一點,要使用xp_mdshell,得将伺服器的“xp_cmdshell”選項打開,參考如下的代碼。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
原文釋出時間為:2018-09-10
本文作者:鄒建
本文來自雲栖社群合作夥伴“
資料和雲”,了解相關資訊可以關注“
”。