zoukankan      html  css  js  c++  java
  • [转]如何在不提升用户权限的情况下,使普通用户执行xp_cmdshell存储过程

    环境需求: . qZ{iuG  

    SQL R RC Server 2005 及之后的版本 
       

    nfGG37  

    背景  

    xp_cmdshell是一个很危险的存储过程,通过它,可以访问操作系统的资源,但有时候我们也需要使用它来实现一些特殊的处理。 
     
    从安全的角度来考虑,禁用xp_cmdsehll是最保险的,即使为了特殊目的而要求使用它,也最好能够编写一些实现这个特殊目的的用户存储过程,只在这个用户存储过程中使用xp_cmdshell,而普通用户只能使用这些用户存储过程。 
     
     
    ;lXz}LF  
    正确的解决办法 
     
    下面的示例显示如何使普通用户在不具有执行存储过程xp_cmdshell的权限下,调用包含了执行xp_cmdshell代码的用户存储过程的方法。 
     
    -- 1. 具有执行xp_cmdshell 权限的登录 
     
    USE master; 
     
    GO Y$S uR;o  
     
    -- 1.a. 建立登录 
    T>f[ "ViU  
    CREATE LOGIN Cmd_Login 
     
    WITH PASSWORD = N'Pwd.123', qI5}yJ  
    aah $#[  
    CHECK_POLICY = OFF; 
     pbvw}  
    GO 
     
    -- 1.b. 这个登录是内置的, 不允许登录, 这样可以减少安全隐藏 
    4t .PSp  
    DENY CONNECT SQL 
     
    TO Cmd_Login; 
     
    GO 
     
     
     
    -- 1.c. 因为要调用xp_cmdshell , 所以在master 中要有用户, 并具有权限 4J Cb Bq  
     
    CREATE USER Cmd_Login 
    H|6m )Cw  
    FOR LOGIN Cmd_Login 
     
    WITH DEFAULT_SCHEMA = dbo; 
     
     
     
    GRANT EXECUTE ON sys.xp_cmdshell 
     
    TO Cmd_Login; 
     
    GO 
     
    b+ z:uB\  
     
     
     
    -- 2. 用户数据库 z% ml3c*9  
    E "%Q9nh  
    USE tempdb; 
     
    GO 
     
     
     
    -- 2.a 为执行xp_cmdshell 权限的登录建立用户 
     
    CREATE USER Cmd_Login 
     
    FOR LOGIN Cmd_Login 
     
    WITH DEFAULT_SCHEMA = dbo; 
     
    GO 
     
     
     
    -- 2.b 测试存储过程 O ] , T$  
     
    CREATE PROC dbo.p 
     
    WITH EXECUTE AS N'Cmd_Login -- 指定存储过程的执行时的上下文 
     
    AS Ls\!�W  
    P9 'W wp  
    EXEC master.sys.xp_cmdshell 'dir c:\' 
     
    GO 
     
     
     
     
     
    -- 3. 调用存储过程的普通登录 
     
    USE master; 
     
    GO 
     
    -- 3.a 登录 
     
    CREATE LOGIN test m Q+^ }}y  
     
    WITH PASSWORD = N'abc.123', 
     
    CHECK_POLICY = OFF; 
     
    GO 
     
    $sdF %Q  
     
    -- 3.b 数据库用户 
     
    USE tempdb; 
     
    GO 
     
    CREATE USER test 
     
    FOR LOGIN test; 
     
    GO 
     
     
     
    -- 3.c 执行存储过程的权限 
     
    GRANT EXECUTE ON dbo.p 
     
    TO test; 
     
    GO 
     
     
     
    -- 3.d 执行测试 L {| _knZ  
     
    EXECUTE AS LOGIN = N'test'; 
     
    GO 
     
    EXEC dbo.p; g%Y6^# 8  
     
    GO \B4y ;=r  
    #&5W7 NB  
    REVERT; 
     
    GO 
     
     
     
    -- 4. 删除测试 
     
    DROP PROC dbo.p; 
     
    DROP USER test; 
     
    DROP USER Cmd_Login; 
     
     
     
    USE master; 
     
    DROP LOGIN test; 
    s %au$1E  
    DROP USER Cmd_Login; 
     
    DROP LOGIN Cmd_Login; 
     
     
     
    补充说明

  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/phyllis/p/2045366.html
Copyright © 2011-2022 走看看