1  /  1  页   1 跳转 查看:2930

[技术文档] xp_cmdshell

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
 

回复:xp_cmdshell

很不错的文章,谢谢!
 
1  /  1  页   1 跳转

版权所有 微软BI开拓者 

Powered by Discuz!NT 2.1.202    Copyright © 2001-2012 Comsenz Inc.
Processed in 0.0625024 second(s) , 4 queries.
返顶部