小编Joh*_*ees的帖子

从过程以 EXECUTE AS OWNER 调用 xp_cmdshell

我试图了解在用户定义的存储过程中包装 xp_cmdshell 功能的详细信息,以便其他用户可以只获得对存储过程的执行权限,而不是 xp_cmdshell。

此场景中的步骤是:

  1. xp_cmdshell 已启用并且 xp_cmdshell 代理已创建
  2. 具有 db_owner 成员身份的用户创建一个调用 xp_cmdshell 的存储过程 WITH EXECUTE AS OWNER
  3. 用户执行存储过程,因此执行任意shell代码

这出乎我的意料。我不希望只有 db_owner 的用户能够实现这一点。(显然假设系统管理员已经启用了 xp_cmdshell。)

当数据库所有者从 sa 更改为另一个低特权登录名时,用户存储过程将不再能够调用 xp_cmdshell。

USE MASTER;
CREATE DATABASE testdb;
CREATE LOGIN testuser WITH PASSWORD = 'password', CHECK_POLICY=OFF;
CREATE LOGIN dummyuser WITH PASSWORD = 'password', CHECK_POLICY=OFF;
SELECT * from sys.credentials WHERE NAME LIKE '%cmdshell%';
-- returned: 101 ##xp_cmdshell_proxy_account## .....

USE testdb;

EXEC sp_changedbowner 'sa';  
CREATE USER testuser FOR LOGIN testuser;
ALTER ROLE db_owner ADD MEMBER testuser;

EXECUTE AS …
Run Code Online (Sandbox Code Playgroud)

sql-server xp-cmdshell

5
推荐指数
1
解决办法
4078
查看次数

标签 统计

sql-server ×1

xp-cmdshell ×1