xp_cmdshell

xp_cmdshell可以以SQLSERVER的上下文(也就是启动sqlserver服务的windows账户)或代理账户的上下文(通过为xp_cmdshell设置凭据)调用操作系统的任意命令。 xp_cmdshell非常灵活,实际上我想说它实在太灵活了,用户可以通过xp_cmdshell执行任何命令,并且没有什么好的方法可以去限制这种灵活性,这简直为它的滥用大行方便。

 

在许多情况下,为了执行操作系统中的操作,人们开启了xp_cmdshell,并且授权那些非sysadmin角色的帐户可以去调用xp_cmdshell,但并没有认识到这些用户可以执行任意命令,在某些情况下,这些用户可以通过xp_cmdshell将自己加入到sysadmin角色甚至提升为windows的管理员.很明显,这并不是我们想要的. Xp_cmdshell非常难控制,即使对它的使用进行了监测,也仍然会让攻击者在被逮住之前大用特用,而那时破坏可能已经发生了。

 

一般来讲,你绝对要避免使用xp_cmdshell,如果可能,你应该将其应用与其脱离。比较好的方式可能是使用CLR,在开发人员可控的范围内创建一个可以执行”外部访问/不安全”(external access/unsafe)操作的程序集(最好使用数字签名来建立信任)来执行需要的操作。优点如下:

·         除了外部/不安全的信任机制(也就是通过签名)的优点,该方法还不依赖于服务器设置

·         sysadmin可以在需要时撤销这种信任关系而不会影响其他应用。

·         更好的粒度控制和孤立性

 

但是请记住CLR并不能解决所有的问题. 如果要给予应用程序(该程序会以SQLSERVER启动账户的身份或者OS上的特权用户的身份执行执行操作)一定程度的信任,你要确保应用程序编码良好的,没有其他安全漏洞(例如代码注入,buffer溢出等等),并且是可控(也就是,不允许随意任意的命令或者打开系统中的文件等等)

 

 如果数据库管理员不希望用户在SQLSERVER中使用CLR而将其禁用,可以使用其他的方式,创建一个T-SQL的存储过程,里面含有需要在操作系统上调用的命令,然后通过Execute as或者数字签名来暂时将调用者提升为sysadmin.使用这种方法是请确保不要有用户输入 (例如为调用命令而使用参数);或者如果你需要使用输入参数的命令,确保对输入进行验证

 

我列出一些和SQL CLR,数字签名有关的链接,希望这些信息能够对你有所帮助

·         TRUSTWORTHY Database property

·         Security Considerations for Databases and Database Applications

·         Permissions Hierarchy

·         Understanding Context Switching

·         Execute As

·         Extending Database Impersonation using Execute As

·         Module Signing

·         CREATE ASSEMBLY

·         Creating an Assembly

 

非常感谢Byham, Laurentiu Cristofor, Ruslan Ovechkin, Jack Richins Sameer Tejani的帮助

 

原文地址:http://blogs.msdn.com/sqlsecurity/archive/2008/01/10/xp-cmdshell.aspx 

 

posted on 2008-08-04 00:40  stswordman  阅读(4736)  评论(4编辑  收藏  举报