假如一個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權限。