SQL Server中xp_cmdshell权限的管理


启用xp_cmdshell

EXECUTE sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

EXECUTE sp_configure 'xp_cmdshell', 1;

GO

RECONFIGURE;

GO

禁用xp_cmdshell

EXECUTE sp_configure 'xp_cmdshell', 0;

GO

RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0;

GO

RECONFIGURE;

GO

SQL Server管理员(sysadmin角色)可以启用禁用xp_cmdshell,也可以任意调用xp_cmdshell:

exec xp_cmdshell 'whoami'

SQL Server中xp_cmdshell权限的管理
 

能过以上xp_cmdshell调用我们发现,管理员实际在windows执行whoami命令时,使用的当前账号是nt servicemssqlserver,也就是mssqlserver的服务账号

由于的xp_cmdshell能直接调用windows程序,危险程度极高,因为我们通常都是禁用xp_cmdshell功能,需要时可以临时开启,用完立即关闭。

SQL Server普通用户是否可以启用xp_cmdshell呢?我们接着测试一下:

SQL Server中xp_cmdshell权限的管理
 

因为普通SQL Server账号并不具有启用或禁用xp_cmdshell的权限,只有拥有sysadmin和serveradmin角色的用户才有权限启用或禁用xp_cmdshell

启用xp_cmdshell,我们需要调用xp_cmdshell

SQL Server中xp_cmdshell权限的管理
 

普通SQL Server账号并不具有xp_cmdshell的执行权限,因此需要授予用户的xp_cmdshell执行权限

use master

create user gg;

grant execute on sys.xp_cmdshell to gg;

SQL Server中xp_cmdshell权限的管理
 

授于系统项的权限需要在master数据库,因此必须切换到master数据库

授权完后调用xp_cmdshell

SQL Server中xp_cmdshell权限的管理
 

发现普通SQL Server账号还是无法调用xp_cmdshell,需要配置代理账号,其实这个代理账号就是windows账号,当你在SQL Server中调用xp_cmdshell时,它将以这个代理账号(windows账号)在windows中执行相关命令。我在windows创建了一个普通本地账号(anlie,密码为00000),当然也可以是域账号。

SQL Server中xp_cmdshell权限的管理
 

在SQL Server中启用代理账号

exec sp_xp_cmdshell_proxy_account 'danganoldanlie','0000'

SQL Server中xp_cmdshell权限的管理
 

再调用xp_cmdshell,发现已使用代理账号执行相关命令了

SQL Server中xp_cmdshell权限的管理
 

使用域账号作为代理账号

SQL Server中xp_cmdshell权限的管理
 

SQL Server中xp_cmdshell权限的管理
 

当授予该SQL Server账号sysadmin角色时

SQL Server中xp_cmdshell权限的管理
 

SQL Server中xp_cmdshell权限的管理
 

因此可以得知,sysadmin角色用户都是使用SQL Server服务账号来执行xp_cmdshell的相关命令

撤消代理账号

exec sp_xp_cmdshell_proxy_account null

SQL Server中xp_cmdshell权限的管理
 

SQL Server中xp_cmdshell权限的管理
 

总结:xp_cmdshell是一个极具杀伤力的武器,因此我们要慎用,有时我们不得不通过xp_cmdshell来执行系统相关操作,但是我们也应该考虑相关风险,尽量控制好相关权限

本文收集自互联网,如果发现有涉嫌侵权或违法违规的内容,请联系6532516@qq.com以便进行及时清除
分享到