WEB开发网
开发学院网络安全黑客技术 如何在不提升用户权限的情况下,使普通用户执行xp... 阅读

如何在不提升用户权限的情况下,使普通用户执行xp_cmdshell存储过程

 2008-11-08 16:50:32 来源:WEB开发网   
核心提示:环境需求:SQL Server 2005 及之后的版本背景xp_cmdshell是一个很危险的存储过程,通过它,如何在不提升用户权限的情况下,使普通用户执行xp_cmdshell存储过程,可以访问操作系统的资源,但有时候我们也需要使用它来实现一些特殊的处理,而普通用户只能使用这些用户存储过程,正确的解决办法下面的示例显

环境需求:

SQL Server 2005 及之后的版本

背景

xp_cmdshell是一个很危险的存储过程,通过它,可以访问操作系统的资源,但有时候我们也需要使用它来实现一些特殊的处理。

从安全的角度来考虑,禁用xp_cmdsehll是最保险的,即使为了特殊目的而要求使用它,也最好能够编写一些实现这个特殊目的的用户存储过程,只在这个用户存储过程中使用xp_cmdshell,而普通用户只能使用这些用户存储过程。

正确的解决办法

下面的示例显示如何使普通用户在不具有执行存储过程xp_cmdshell的权限下,调用包含了执行xp_cmdshell代码的用户存储过程的方法。

-- 1. 具有执行xp_cmdshell 权限的登录
USE master;
GO
-- 1.a. 建立登录
CREATE LOGIN Cmd_Login
WITH PASSWORD = N'Pwd.123',
  CHECK_POLICY = OFF;
GO
-- 1.b. 这个登录是内置的, 不允许登录, 这样可以减少安全隐藏
DENY CONNECT SQL
  TO Cmd_Login;
GO
  
-- 1.c. 因为要调用xp_cmdshell , 所以在master 中要有用户, 并具有权限
CREATE USER Cmd_Login
FOR LOGIN Cmd_Login
WITH DEFAULT_SCHEMA = dbo;
  
GRANT EXECUTE ON sys.xp_cmdshell
  TO Cmd_Login;
GO
  
-- 2. 用户数据库
USE tempdb;
GO
  
-- 2.a 为执行xp_cmdshell 权限的登录建立用户
CREATE USER Cmd_Login
FOR LOGIN Cmd_Login
WITH DEFAULT_SCHEMA = dbo;
GO
  
-- 2.b 测试存储过程
CREATE PROC dbo.p
WITH EXECUTE AS N'Cmd_Login' -- 指定存储过程的执行时的上下文
AS
  EXEC master.sys.xp_cmdshell 'dir c:'
GO
  
-- 3. 调用存储过程的普通登录
USE master;
GO
-- 3.a 登录
CREATE LOGIN test
WITH PASSWORD = N'abc.123',
  CHECK_POLICY = OFF;
GO
  
-- 3.b 数据库用户
USE tempdb;
GO
CREATE USER test
FOR LOGIN test;
GO
  
-- 3.c 执行存储过程的权限
GRANT EXECUTE ON dbo.p
  TO test;
GO
  
-- 3.d 执行测试
EXECUTE AS LOGIN = N'test';
GO
EXEC dbo.p;
GO
REVERT;
GO
  
-- 4. 删除测试
DROP PROC dbo.p;
DROP USER test;
DROP USER Cmd_Login;
  
USE master;
DROP LOGIN test;
DROP USER Cmd_Login;
DROP LOGIN Cmd_Login;

1 2  下一页

Tags:如何 提升 用户

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接