天天看點

普通使用者竟這樣執行xp_cmdshell存儲過程!

01環境需求

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

本文作者:鄒建

本文來自雲栖社群合作夥伴“

資料和雲

”,了解相關資訊可以關注“

”。