一、空口令或弱口令
初學者在安裝SQL Server時為了省事,SQL Server管理員sa 用的是空口令或弱口令,這樣危險性十分巨大,而這些危險往往是初學者意識不到的,小王就覺得,自己的庫是試驗數(shù)據(jù),沒什么用,即使別人連上庫也無所謂。殊不知SQL Server的默認用戶sa的權(quán)限非常巨大,有種觀點是sa的權(quán)限要大于administrator的權(quán)限,也就是說沒有限制的sa用戶可以做Windows系統(tǒng)管理員所做的任何事。
下面我們做個簡單的試驗。通過SQL Server給Windows系統(tǒng)增加一個用戶user1,并且把該用戶增加到管理員用戶組administrators里。
1、首先看看正常情況下在Windows系統(tǒng)增加該用戶的方法。
有兩種:一是在圖形界面下進行,二是在命令窗口下進行,下面演示通過命令增加用戶。
1)、在“開始”——〉“運行”處輸入cmd,回車進入到命令窗口,如圖1所示:
2)、第一行命令net user user1 /add (增加一個用戶名是user1的用戶)。
3)、第二行net localgroupadminisstrators user1 /add(將此用戶增加到管理員用戶組administrators中)。
4)、第三行net user(查看目前系統(tǒng)的用戶,可以看到已增加了user1用戶)。
5)、第四行net user user1 /delete (刪除user1用戶),為了下面通過SQL Server 給系統(tǒng)增加用戶。

2、在SQL Server中增加系統(tǒng)用戶
1)、打開SQL Server的“企業(yè)管理器”——〉“工具”——〉 “SQL 查詢分析器” 。如圖2,輸入要連接的SQL Server的IP地址,確定后出現(xiàn)圖3界面,注意連接的是master庫。

2)、如圖3所示,在查詢窗口中輸入:exec xp_cmdshell 'net user user1 /add',按 執(zhí)行,如果出現(xiàn)圖4“命令成功完成”的提示說明執(zhí)行成功。
3)、接著如圖5所示,輸入exec xp_cmdshell 'net localgroup administrators user1 /add',執(zhí)行成功后出現(xiàn)圖5的提示說明。



上邊輸入的 net user user1 /add 和 net localgroup administrators user1 /add是不是很眼熟?它們就是我們上面用過的windows系統(tǒng)下的標準命令。圖6可以看出user1已增加到管理員administrators組中。

圖6
看到這明白了吧!通過功能強大的SQL Server可以做Windows系統(tǒng)管理員能做的事。上面通過SQL Server建立用戶的實驗是我從本機遠程連接到測試機的SQL Server,增加了用戶,圖7是用剛建立的用戶user1和遠程計算機建立的ipc連接,這時要進入這臺機器就是易如反掌的事了。接下來的的安全知識自己查查吧,網(wǎng)上非常多的。

3、進一步解釋
上面用的xp_cmdshell是SQL Server的擴展存儲過程中的一個,存儲過程就像是我們編程用的函數(shù),內(nèi)容是按需要編寫的一系列SQL 語句和可選控制流語句,可由應用程序通過一個調(diào)用執(zhí)行,而且允許用戶聲明變量、有條件執(zhí)行以及其它強大的編程功能。每個庫都可以存放存儲過程,但擴展存儲過程只存在master 數(shù)據(jù)庫中,對用戶來說,擴展存儲過程與普通存儲過程一樣,執(zhí)行方法也相同。但擴展存儲過程能執(zhí)行除了數(shù)據(jù)庫之外的許多操作,上面我們看到通過調(diào)用xp_cmdshell可以執(zhí)行windows系統(tǒng)下的各種命令。
擴展存儲過程的功能非常強大,如圖8,它們存在master庫中的擴展存儲過程中。
如xp_regenumvalues、 xp_regread、 xp_regwrite 、xp_regdeletevalue、 xp_regdeletekey這些擴展存儲過程能對注冊表進行讀寫操作。例如:可以通過下面命令查看注冊表中的啟動項目。
Exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run'

二、注入和跨庫攻擊
注入和跨庫攻擊可能是2004年黑客攻擊中最流行的詞了,它的原理和上面講的都是獲得了SQL Server管理員sa的權(quán)限,從而控制數(shù)據(jù)庫,還可以利用xp_cmdshell這樣的SQL Server的擴展存儲過程控制Windows系統(tǒng)。注入和空口令獲取sa權(quán)限的方法不同,注入是ASP程序在連接SQL Server時有漏洞,黑客利用漏洞獲取了sa權(quán)限。說到這,小王有點疑問,程序中sa連接的是自己的庫而擴展存儲過程在master庫中,如何利用的?簡單的說,有sa 的權(quán)限后就能查詢出用戶建的什么庫,庫中有哪些表,表中有什么字段,表的紀錄等。這些又是如何實現(xiàn)的呢?
要解答這個問題需要從兩個方面著手,一是新建個庫后,SQL Server起了什么變化?二是SQL Server的權(quán)限。
1、新建一個庫后其在系統(tǒng)庫和系統(tǒng)表的位置
例:在SQL Server新建一個庫,庫名稱為:xyz,在該庫下建一個test的表,表中字段為id、name、password。
1)、庫在哪里?
SQL Server安裝完畢后默認安裝了master、model、msdb、northwind、pubs、tempdb這6個庫,其中northwind、pubs是例子庫,其它都是系統(tǒng)數(shù)據(jù)庫,各有其用。xyz庫建好后,庫名稱存在master庫中的sysdatabases表中,如圖9所示,sysdatabases表中的 dbid字段的值大于6的就是用戶自己建的庫。圖10中用SELECT name FROM sysdatabases where dbid>6可以查出用戶自己建的庫,剛建的xyz庫也在其中。


2)、表在哪里?
表名稱存在xyz庫中的sysobjects表且xtype='u',如圖11,輸入SELECT *FROM sysobjects where xtype='u'可以查出表名稱是test,記住我們剛建的表test對應的id是357576312

3)、有哪些字段?
test表中有哪些字段呢?該表的字段存在xyz庫中的syscolumns表中,且id等于sysobjects表中test表對應的id,也就是我們上面查出來的357576312。
如圖12,輸入SELECT * FROM syscolumns where id='357576312'可以查出test表中的字段。

4)、總結(jié)
當有相應權(quán)限的用戶連到SQL Server后,能通過查詢master庫中的sysdatabases表得到用戶建的數(shù)據(jù)庫名稱,接著再查詢用戶數(shù)據(jù)庫的sysobjects表查出創(chuàng)建的表,接著再查詢用戶數(shù)據(jù)庫的syscolumns表查出表中的字段,進而查出紀錄。
這個例子提到有相應權(quán)限的用戶,那用戶具有哪些權(quán)限呢?我們接著說。
2、理解用戶、角色和權(quán)限這幾個概念
要對這幾個概念講得很明白,需要很大的篇幅,本文只作簡要介紹。
要想訪問SQL Server必須是它的一個用戶,如果要訪問某個數(shù)據(jù)庫,必須賦予該用戶訪問此數(shù)據(jù)庫的權(quán)限。角色就是一系列權(quán)限的集合。用戶和角色的關(guān)系就像Windows系統(tǒng)中的用戶和用戶組的關(guān)系。
還是舉例說明吧!sa為什么有那么大的權(quán)限?
sa是SQL Server的默認超級用戶,就像系統(tǒng)的administrator用戶一樣,如圖13,點擊在“安全性”——〉“登錄”,在右欄的sa用戶下鼠標右鍵,出現(xiàn)圖14的sa屬性界面選到“服務器角色”項,可以看到sa的角色是system administrators(簡寫為sysadmin),前面提到角色就是一系列權(quán)限的集合,點擊圖14的“屬性”,在圖15中可以看到該角色擁有操作SQL Server的所有權(quán)限。如圖16可以看出sa具有所有數(shù)據(jù)庫的訪問權(quán)限,現(xiàn)在明白sa為什么有那么大的權(quán)限了吧。




實際做管理系統(tǒng)時并不需要用戶有那么大的權(quán)限,一般只要能訪問自己建的庫就行了。可以新建個用戶,只給此用戶有限的權(quán)限,這樣安全系數(shù)應該高些,從這個思路出發(fā)看看如何實現(xiàn)。