啟用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'
![]()
能過以上xp_cmdshell調用我們發現,管理員實際在windows執行whoami命令時,使用的當前賬號是nt servicemssqlserver,也就是mssqlserver的服務賬號
由于的xp_cmdshell能直接調用windows程序,危險程度極高,因為我們通常都是禁用xp_cmdshell功能,需要時可以臨時開啟,用完立即關閉。
SQL Server普通用戶是否可以啟用xp_cmdshell呢?我們接著測試一下:
![]()
因為普通SQL Server賬號并不具有啟用或禁用xp_cmdshell的權限,只有擁有sysadmin和serveradmin角色的用戶才有權限啟用或禁用xp_cmdshell
啟用xp_cmdshell,我們需要調用xp_cmdshell
![]()
普通SQL Server賬號并不具有xp_cmdshell的執行權限,因此需要授予用戶的xp_cmdshell執行權限
use master
create user gg;
grant execute on sys.xp_cmdshell to gg;
![]()
授于系統項的權限需要在master數據庫,因此必須切換到master數據庫
授權完后調用xp_cmdshell
![]()
發現普通SQL Server賬號還是無法調用xp_cmdshell,需要配置代理賬號,其實這個代理賬號就是windows賬號,當你在SQL Server中調用xp_cmdshell時,它將以這個代理賬號(windows賬號)在windows中執行相關命令。我在windows創建了一個普通本地賬號(anlie,密碼為00000),當然也可以是域賬號。
![]()
在SQL Server中啟用代理賬號
exec sp_xp_cmdshell_proxy_account 'danganoldanlie','0000'
![]()
再調用xp_cmdshell,發現已使用代理賬號執行相關命令了
![]()
使用域賬號作為代理賬號
![]()
![]()
當授予該SQL Server賬號sysadmin角色時
![]()
![]()
因此可以得知,sysadmin角色用戶都是使用SQL Server服務賬號來執行xp_cmdshell的相關命令
撤消代理賬號
exec sp_xp_cmdshell_proxy_account null
![]()
![]()
總結:xp_cmdshell是一個極具殺傷力的武器,因此我們要慎用,有時我們不得不通過xp_cmdshell來執行系統相關操作,但是我們也應該考慮相關風險,盡量控制好相關權限






