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