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
· Understanding Context Switching
· Extending Database Impersonation using Execute As
非常感谢Byham, Laurentiu Cristofor, Ruslan Ovechkin, Jack Richins 和 Sameer Tejani的帮助
原文地址:http://blogs.msdn.com/sqlsecurity/archive/2008/01/10/xp-cmdshell.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2006-08-04 Highlighting Rows with TextBox OnFocus
2006-08-04 Change GridView RowColor OnMouseClick
2006-08-04 Changing GridView Row Color OnMouseOver