• 普通用户竟这样执行xp_cmdshell存储过程!


    关注我们获得更多内容

    640?wx_fmt=jpeg


    作者 | 邹建,资深数据库专家,精通各项 SQL Server 技术,具有丰富的管理、维护、优化能力以及业务应用经验。他一直热心于技术知识的分享、传播,持续活跃在 CSDN 和 MSDN 社区,曾多年蝉联 CSDN 论坛积分榜首。


    此外,邹建还是 2004~2010、2013年度 MVP(微软最有价值专家) 获得者。著有《深入浅出 SQL Server 2005开发、管理与应用实例》《SQL Server 2000开发与管理应用实例》等畅销书。


    01环境需求

    SQL Server 2005 及之后的版本

     

    02背景


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


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

     

    03正确的解决办法


    下面的示例显示如何使普通用户在不具有执行存储过程 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;

     

    04补充说明


    多数情况下,数据库的所有者是 sa 一类的 sysadmin 固定服务器角色的成员,所以在这种情况下,也可以直接指定使用数据库所有者作为存储过程执行的安全上下文。


    用户的数据库


    USE tempdb;

    GO


    -- 2.b 测试存储过程

    CREATE PROC dbo.p

    WITH EXECUTE AS N'dbo'  -- 指定存储过程的执行时的上下文

    AS

        EXEC master.sys.xp_cmdshell 'dir c:/'

    GO

      


    调用存储过程的普通登录


    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

     


    删除测试


    DROP PROC dbo.p;

    DROP USER test;

    USE master;

    DROP LOGIN test;

    使用前述方法的时候,实例中需要有 xp_cmdshel l代理帐户(默认是没有的), 否则会收到下面的错误信息。


    消息15153,级别16,状态1,过程xp_cmdshell,第1 行xp_cmdshell 代理帐户信息无法检索或无效。请验证'##xp_cmdshell_proxy_account##' 凭据存在并且包含有效的信息。


    可以使用下面的代码创建xp_cmdshell代理帐户

    USE master;

    GO

    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 代理帐户

    SELECT

        @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;

    RECONFIGURE;


    原创:邹建

    投稿:有投稿意向技术人请在公众号对话框留言。

    转载:意向文章下方留言。

    更多精彩请关注 “数据和云” 公众号 。


    招聘专栏

    Oracle 售前工程师(广州、深圳、上海、武汉、北京、石家庄)

    Oracle 高级工程师(上海、深圳、北京、成都、昆明、贵州、西宁)

    MySQL 技术经理(上海、南京、成都)

    MySQL 工程师(上海、杭州)

    超高待遇:丰厚的年终奖,五险一金,高额学习基金,团建旅游,法定节假日,福利假期等。

    推荐他人成功入职有好礼(iPhone X)相送 。

    投递简历至邮箱:hr@enmotech.com

    资源下载

    关注公众号:数据和云(OraNews)回复关键字获取

    2018DTCC , 数据库大会PPT

    2017DTC,2017 DTC 大会 PPT

    DBALIFE ,“DBA 的一天”海报

    DBA04 ,DBA 手记4 电子书

    122ARCH ,Oracle 12.2体系结构图

    2017OOW ,Oracle OpenWorld 资料

    PRELECTION ,大讲堂讲师课程资料

    近期文章

    仅仅使用AWR做报告? 性能优化还未入门

    实战课堂:一则CPU 100%的故障分析

    杨廷琨:如何编写高效SQL(含PPT)

    一份高达555页的技术PPT会是什么样子?

    大象起舞:用PostgreSQL解海盗分金问题

    ProxySQL!像C罗一样的强大

    高手过招:用SQL解决环环相扣刑侦推理问题

    640?wx_fmt=jpeg

  • 相关阅读:
    zabbix监控nginx的性能
    常用iptables命令
    shell脚本小示例
    打印菜单脚本
    ping主机脚本
    Linux网络配置脚本
    多磁盘自动分区自动挂载脚本
    深入js系列-类型(null)
    深入js系列-类型(开篇)
    first-child、last-child误解
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312276.html
Copyright © 2020-2023  润新知