假如一個SQL Server實例只允許“SQL身份認證”模式登錄數據庫,而糟糕的是你忘記了sa的密碼(sa出於安全考慮應該被禁用,這里僅僅為了描述問題)或其它具有sysadmin角色的登錄名的密碼?個人就遇到這樣一個案例,HK一同事在一台測試服務器安裝了一個測試用途的SQL Server數據庫,然后這個同事離職前沒有交接這個測試服務器任何信息。那現在就麻煩了。我沒有任何權限,我如何獲取sysadmin的權限呢?或者還有比較多的場景需要你獲取數據庫的sysadmin權限,例如你想干點壞事.... 其實這個問題也不難,只要你有這個SQL Server數據庫的所在的服務器的操作系統管理員權限。
首先說明一下,下面腳本在SQL Server 2012、2014環境下都測試過,下面來一起看看如何在只有操作系統的管理員權限的情況下獲取數據庫的sysamdin權限。
其實在闡述這個問題前,可能要先說一下賬號([builtin\administrators]),在SQL Server 2005的版本中,數據庫中[builtin\administrators]登錄名默認擁有sysadmin角色,所以,如果是SQL Server 2005數據庫,只要你有操作系統的管理員權限,那么其實你就可以以Windows身份認證登錄數據庫(前提是服務器允許Windows身份認證登錄),登錄后修改sa賬號密碼即可,但是后續版本中都剔除了內置系統帳戶([builtin\administrators])。那么通常的方法如何做呢?
其實只要你有操作系統的管理員權限,那么借助sqlcmd工具,很容易也很簡單就能獲取擁有sysadmin角色的賬號。
1:首先必須單用戶模式啟動SQL Server實例(注意,要以管理員權限運行cmd窗口,否則可能遇到權限問題),否則sqlcmd就會遇到類似這樣的問題
C:\Windows\system32>sqlcmd
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Login failed for user '
xxx\xxxx’..
C:\>net stop mssqlserver
The SQL Server (MSSQLSERVER) service is stopping.
The SQL Server (MSSQLSERVER) service was stopped successfully.
C:\>net start mssqlserver /m"SQLCMD"
The SQL Server (MSSQLSERVER) service is starting.
The SQL Server (MSSQLSERVER) service was started successfully.
2:然后在另外一個cmd窗口使用sqlcmd登錄數據庫
C:\>
C:\>
C:\>sqlcmd -E
1> ALTER LOGIN sa WITH PASSWORD='qWeR123456';
2> GO
1>
參數-E 表示 [-E trusted connection] 默認即是-E,如上所示,進去修改sa的密碼,然后登錄測試發現sa被禁用了,使用SQL語句允許sa登錄即可。如下所示:
當然你也可以創建一個賬號授予sysadmin角色。完全沒有問題。
C:\>sqlcmd -E
1> CREATE LOGIN [xxx\xxx] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
2> GO
1> ALTER SERVER ROLE [sysadmin] ADD MEMBER [xxx\xxx]
2> GO
或者SQL認證賬號
C:\>sqlcmd -E
1> CREATE LOGIN [test1] WITH PASSWORD=N'Qw123456', DEFAULT_DATABASE=[master], DE
FAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
2> GO
1>
2>
3> ALTER SERVER ROLE [sysadmin] ADD MEMBER [test1]
4> GO
1>
是否感覺有點太簡單了,太不安全了? 系統管理員輕松就獲取了數據庫的管理員權限。 這個功能怎么感覺都不太合理!試想,如果系統被入侵了,分分鍾就能獲取數據庫的sysadmin權限。