Oracle的銷售在向客戶兜售其數(shù)據(jù)庫(kù)系統(tǒng)一直把它吹捧為牢不可破的,耍嘴皮子容易,兌現(xiàn)起來(lái)可就不那么容易了。不管什么計(jì)算機(jī)系統(tǒng),人們總能夠找到攻擊它的方法,Oracle也不例外。本文將和大家從黑客的角度討論黑客是用哪些方法把黑手伸向了你原以為他們不能觸及的數(shù)據(jù),希望作為Oracle的數(shù)據(jù)庫(kù)管理員能夠清楚的闡明自己基礎(chǔ)架構(gòu)的哪些區(qū)域比較容易受到攻擊。同時(shí)我們也會(huì)討論保護(hù)系統(tǒng)防范攻擊的方法。
1.SQL注入攻擊
如今大部分的Oracle數(shù)據(jù)庫(kù)都具有為某種類型網(wǎng)絡(luò)應(yīng)用服務(wù)的后端數(shù)據(jù)存儲(chǔ)區(qū),網(wǎng)頁(yè)應(yīng)用使數(shù)據(jù)庫(kù)更容易成為我們的攻擊目標(biāo)體現(xiàn)在三個(gè)方面。其一,這些應(yīng)用界面非常復(fù)雜,具有多個(gè)組成成分,使數(shù)據(jù)庫(kù)管理員難以對(duì)它們進(jìn)行徹底檢查。其二,阻止程序員侵入的屏障很低,即便不是C語(yǔ)言的編程專家,也能夠?qū)σ恍╉?yè)面進(jìn)行攻擊。下面我們會(huì)簡(jiǎn)單地解釋為什么這對(duì)我們這么重要。第三個(gè)原因是優(yōu)先級(jí)的問(wèn)題。網(wǎng)頁(yè)應(yīng)用一直處于發(fā)展的模式,所以他們?cè)诓粩嘧兓脐惓鲂?。這樣安全問(wèn)題就不是一個(gè)必須優(yōu)先考慮的問(wèn)題。
SQL注入攻擊是一種很簡(jiǎn)單的攻擊,在頁(yè)面表單里輸入信息,悄悄地加入一些特殊代碼,誘使應(yīng)用程序在數(shù)據(jù)庫(kù)里執(zhí)行這些代碼,并返回一些程序員沒(méi)有料到的結(jié)果。例如,有一份用戶登錄表格,要求輸入用戶名和密碼才能登錄,在用戶名這一欄,輸入以下代碼:
cyw'); select username, password from all_users;--
如果數(shù)據(jù)庫(kù)程序員沒(méi)有聰明到能夠檢查出類似的信息并“清洗”掉我們的輸入,該代碼將在遠(yuǎn)程數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行,然后這些關(guān)于所有用戶名和密碼的敏感數(shù)據(jù)就會(huì)返回到我們的瀏覽器。
你可能會(huì)認(rèn)為這是在危言聳聽(tīng),不過(guò)還有更絕的。David Litchfield在他的著作《Oracle黑客手冊(cè)》(Oracle Hacker's Handbook)中把某種特殊的pl/sql注入攻擊美其名曰:圣杯(holy grail),因?yàn)樗racle 8到Oracle10g的所有Oracle數(shù)據(jù)庫(kù)版本。很想知道其作用原理吧。你可以利用一個(gè)被稱為DBMS_EXPORT_EXTENSION的程序包,使用注入攻擊獲取執(zhí)行一個(gè)異常處理程序的代碼,該程序會(huì)賦予用戶或所有相關(guān)用戶數(shù)據(jù)庫(kù)管理員的特權(quán)。
這就是Oracle發(fā)布的著名安全升級(jí)補(bǔ)丁Security Alert 68所針對(duì)的漏洞。不過(guò)據(jù)Litchfield稱,這些漏洞是永遠(yuǎn)無(wú)法完全修補(bǔ)完畢的。
防范此類攻擊的方法
總而言之,雖說(shuō)沒(méi)有萬(wàn)能的防彈衣,但鑒于這個(gè)問(wèn)題涉及到所有面向網(wǎng)絡(luò)的應(yīng)用軟件,還是要盡力防范。目前市面上有各式各樣可加以利用的SQL注入檢測(cè)技術(shù)??梢詤⒄説ttp://www.securityfocus.com/infocus/1704 系列文章的詳細(xì)介紹。
還可以用不同的入侵檢測(cè)工具在不同的水平上檢測(cè)SQL注入攻擊。訪問(wèn)專門(mén)從事Oracle安全性研究的Pete Finnigan的安全網(wǎng)站http://www.petefinnigan.com/orasec.htm,在該網(wǎng)頁(yè)搜索“sql injection”,可以獲得更多相關(guān)信息。Pete Finnigan曾在其博客上報(bào)告稱Steven Feurstein目前正在編寫(xiě)一個(gè)稱為SQL Guard 的pl/sql程序包,專門(mén)用來(lái)防止SQL注入攻擊,詳情請(qǐng)查看以下網(wǎng)頁(yè)http://www.petefinnigan.com/weblog/archives/00001115.htm。
對(duì)于軟件開(kāi)發(fā)人員來(lái)說(shuō),很多軟件包都能夠幫助你“清洗”輸入信息。如果你調(diào)用對(duì)從頁(yè)面表單接受的每個(gè)值都調(diào)用清洗例行程序進(jìn)行處理,這樣可以更加嚴(yán)密的保護(hù)你的系統(tǒng)。不過(guò),最好使用SQL注入工具對(duì)軟件進(jìn)行測(cè)試和驗(yàn)證,以確保萬(wàn)無(wú)一失。
1. 默認(rèn)密碼
Oracle數(shù)據(jù)庫(kù)是一個(gè)龐大的系統(tǒng),提供了能夠創(chuàng)建一切的模式。絕大部分的系統(tǒng)自帶用戶登錄都配備了預(yù)設(shè)的默認(rèn)密碼。想知道數(shù)據(jù)庫(kù)管理員工作是不是夠勤奮?這里有一個(gè)方法可以找到答案??纯聪旅孢@些最常用的預(yù)設(shè)用戶名和密碼是不是能夠登錄到數(shù)據(jù)庫(kù)吧:
Username Password
applsys apps
ctxsys change_on_install
dbsnmp dbsnmp
outln outln
owa owa
perfstat perfstat
scott tiger
system change_on_install
system manager
sys change_on_install
sys manager
就算數(shù)據(jù)庫(kù)管理員已經(jīng)很勤奮的把這些默認(rèn)配對(duì)都改了,有時(shí)候想猜出登錄密碼也不是一件困難的事情,逐個(gè)試試“oracle”、“oracle4”、“oracle8i”、“oracle11g”,看看碰巧是不是有一個(gè)能登錄上去的。
Pete Finnigan提供了一份關(guān)于缺省用戶和對(duì)應(yīng)密碼的名單,該名單非常全面而且是最新的,并包括已經(jīng)加密的密碼。如果你用all_users來(lái)進(jìn)行查詢,可以嘗試并比較一下這份名單,詳細(xì)名單請(qǐng)參閱:http://www.petefinnigan.com/default/default_password_list.htm。
防范此類攻擊的方法
作為數(shù)據(jù)庫(kù)管理員,應(yīng)該定期審核所有的數(shù)據(jù)庫(kù)密碼,如果某些商業(yè)方面的阻力使你不能輕易更改容易被人猜出的密碼,你可以盡量心平氣和地和相關(guān)人員解釋,用一些直觀的例子來(lái)闡明如果不修改密碼的話會(huì)有什么不好的事情發(fā)生,會(huì)有什么樣的風(fēng)險(xiǎn)存在。
Oracle也提供了密碼安全profile,你可以激活該profile,在某種水平上加強(qiáng)數(shù)據(jù)庫(kù)密碼的復(fù)雜性,還可以執(zhí)行定期密碼失效。要注意要把這個(gè)功能設(shè)置為只對(duì)通過(guò)網(wǎng)絡(luò)服務(wù)器或中間層應(yīng)用服務(wù)器登錄的事件起作用。
2. 蠻力攻擊(Brute Force)
蠻力攻擊,就像其名字所暗示的,就是不停的撬,直到“鎖”打開(kāi)為止的方法。對(duì)于Oracle數(shù)據(jù)庫(kù)來(lái)說(shuō),就是用某種自動(dòng)執(zhí)行的進(jìn)程,通過(guò)嘗試所有的字母數(shù)字組合來(lái)破解用戶名和密碼。
Unix的管理員就可以利用一款名為John the Ripper的密碼破解軟件來(lái)執(zhí)行這類的攻擊?,F(xiàn)在如果你下載某個(gè)補(bǔ)丁,你也可以利用這款軟件來(lái)對(duì)Oracle進(jìn)行蠻力攻擊,敲開(kāi)其密碼。不過(guò)根據(jù)密碼的復(fù)雜程度不同,這可能是個(gè)很費(fèi)時(shí)的過(guò)程,如果你想加快這個(gè)進(jìn)程,可以事先準(zhǔn)備一張包含所有密碼加密的表,這樣的表叫做Rainbow table,你可以為每個(gè)用戶名準(zhǔn)備一張不同的rainbow table,因?yàn)檫@種密碼加密算法把用戶名作為助燃劑。在這里就不再深入介紹更多的細(xì)節(jié)問(wèn)題了,大家可以查閱http://www.antsight.com/zsl/rainbowcrack/獲得更多信息。
Oracle服務(wù)器的默認(rèn)設(shè)置是,對(duì)某個(gè)特定帳戶輸錯(cuò)密碼達(dá)十次就會(huì)自動(dòng)鎖定該帳戶。不過(guò)通?!皊ys as sysdba”權(quán)限沒(méi)有這個(gè)限制,這可能是因?yàn)槿绻沔i定了管理員,那所有人都將被鎖定。這樣的設(shè)置為我們黑客破解軟件(OraBrute)如開(kāi)辟了一條生路,它們會(huì)晝夜不停地敲打你數(shù)據(jù)庫(kù)的前門(mén),直到它乖乖打開(kāi)為止。
防范此類攻擊的方法
想要抵御此類攻擊,可以使用之前提及的對(duì)付預(yù)設(shè)密碼攻擊的方法。不過(guò)好奇心過(guò)重的數(shù)據(jù)庫(kù)管理員也可能下載上面提到的工具侵入自己的系統(tǒng)。這說(shuō)明了你真正的風(fēng)險(xiǎn)來(lái)自何方。
4. 從后門(mén)偷竊數(shù)據(jù)
在安全領(lǐng)域,這個(gè)概念被稱為數(shù)據(jù)向外滲漏(exfiltration),這個(gè)詞來(lái)自軍事術(shù)語(yǔ),其反面是向敵人內(nèi)部滲透(infiltration),意思就是在不被發(fā)現(xiàn)的情況下偷偷潛出。對(duì)于從目標(biāo)數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的過(guò)程,可能就像從一些磁帶備份中挑揀數(shù)據(jù)和還原數(shù)據(jù)庫(kù)或者像從一個(gè)被毀壞的磁盤(pán)重復(fù)制一份拷貝一樣簡(jiǎn)單。不過(guò),也有可能涉及到窺探網(wǎng)絡(luò)傳輸以獲得相關(guān)的數(shù)據(jù)包。
Oracle有一個(gè)名為UTL_TCP的程序包,能夠使外部連接指向其他服務(wù)器。對(duì)它稍微改編一下,就可以利用它從數(shù)據(jù)庫(kù)發(fā)送一套低帶寬數(shù)據(jù)流到遠(yuǎn)程主機(jī)。Oracle也附帶了一些有用的程序包來(lái)隱藏?cái)?shù)據(jù)流里的信息,如果你在發(fā)動(dòng)潛入行動(dòng)的時(shí)候擔(dān)心入侵檢測(cè)系統(tǒng)會(huì)監(jiān)測(cè)到你的不法活動(dòng),那么可以充分利用這些功能秘密嵌入,包括DBMS_OBFUSCATION_TOOLKIT和DBMS_CRYPTO。
防范此類攻擊的方法
防范此類攻擊的最佳辦法是安裝入侵檢測(cè)系統(tǒng),這些系統(tǒng)能夠檢測(cè)網(wǎng)絡(luò)中流入和流出的數(shù)據(jù)包。有一些檢測(cè)系統(tǒng)還提供深入數(shù)據(jù)包檢測(cè),可以確實(shí)檢查某些SQL,并可以通過(guò)設(shè)定規(guī)則在某種情況下觸發(fā)報(bào)警器。這些工具還能夠查找泄密跡象,例如添加的UNION、各種類型的short- circuiting命令、利用“--”注釋進(jìn)行截?cái)嗟鹊取?/P>
5. 監(jiān)聽(tīng)器
計(jì)算機(jī)世界最讓人覺(jué)得了不起的事情就是,不管有多么困難的事,總有辦法馴服它。尤其是在安全領(lǐng)域,一些漏洞如此的簡(jiǎn)單,而這些漏洞的出現(xiàn)僅僅是因?yàn)橛脩?也包括我們現(xiàn)在扮演的角色——黑客)并沒(méi)有像軟件設(shè)計(jì)者(程序員或軟件開(kāi)發(fā)員)本來(lái)預(yù)想的那樣思考和行動(dòng)。
Oracle監(jiān)聽(tīng)器的設(shè)置是為了能夠?qū)崿F(xiàn)遠(yuǎn)程管理。那么如果攻擊者把監(jiān)聽(tīng)器的logfile設(shè)置為Unix .rhosts文件呢?這樣攻擊者就可以輕松的對(duì).rhosts文件進(jìn)行寫(xiě)操作。Unix上的這個(gè)文件設(shè)置了什么人可以不用密碼而使用rsh、rlogin和rcp命令登錄。你可以想想將會(huì)發(fā)生什么事情。
這其實(shí)只是圍繞Oracle監(jiān)聽(tīng)器安全問(wèn)題的冰山一角而已。其他的還有緩沖區(qū)溢出等一大堆問(wèn)題需要注意。事實(shí)上Litchfield的《Oracle黑客手冊(cè)》里花了一整章的內(nèi)容來(lái)討論這個(gè)主題。
防范此類攻擊的方法
從預(yù)防的角度而言,Oracle已經(jīng)做出了一定措施來(lái)更好的保障系統(tǒng)安全,前提是你能夠把它實(shí)施到位。首先,為監(jiān)聽(tīng)器設(shè)置一個(gè)管理密碼。對(duì)于擔(dān)負(fù)著管理不斷增加的密碼重?fù)?dān)的管理員而言,這看起來(lái)像是多余的,不過(guò)在你需求其他途徑來(lái)保障監(jiān)聽(tīng)器安全之前,好好地想想上面提到的和沒(méi)提到的威脅。Oracle也添加了ADMIN_RESTRICTIONS,能夠阻止特定的遠(yuǎn)程控制事件。
6. 權(quán)限提升
簡(jiǎn)單的說(shuō),“權(quán)限提升”包括使用現(xiàn)有的低權(quán)限帳戶,利用巧取、偷竊或非法的方式獲取更高的權(quán)限,甚至是數(shù)據(jù)庫(kù)管理員的權(quán)限。
下面舉個(gè)使用CREATE ANY權(quán)限的例子。假設(shè)我能通過(guò)一個(gè)擁有CREATE ANY TRIGGER權(quán)限的用戶CYW訪問(wèn)數(shù)據(jù)庫(kù),這樣我就能在任意的模式里創(chuàng)建觸發(fā)器。如果你能追蹤到一個(gè)任何用戶都能執(zhí)行寫(xiě)入操作的表,你在SYSTEM里創(chuàng)建了一個(gè)能夠在低權(quán)限的你對(duì)該可寫(xiě)表進(jìn)行插入或更新操作時(shí)執(zhí)行的觸發(fā)器。你編寫(xiě)的觸發(fā)器會(huì)調(diào)用一個(gè)存儲(chǔ)過(guò)程(也是你自己編寫(xiě)的),該存儲(chǔ)過(guò)程會(huì)使用AUTHID CURRENT_USER為調(diào)用者授權(quán)。這就意味著,當(dāng)該觸發(fā)器運(yùn)行“你”的存儲(chǔ)過(guò)程時(shí),擁有SYSTEM的權(quán)限?,F(xiàn)在你的非法存儲(chǔ)過(guò)程內(nèi)部,包含了“EXECUTE IMMEDIATE 'GRANT DBA TO CYW'”。這樣我就可以在觸發(fā)器運(yùn)行的時(shí)候插入到我的公共表里,該觸發(fā)器由SYSTEM所有,而SYSTEM會(huì)調(diào)用我的change_privileges存儲(chǔ)過(guò)程,這個(gè)存儲(chǔ)過(guò)程使用AUTHID CURRENT_USER為我授權(quán)。這樣“我”就可以在不改變我自身權(quán)限的情況下獲得并執(zhí)行SYSTEM的權(quán)限。
防范此類攻擊的方法
數(shù)據(jù)庫(kù)管理員該怎么應(yīng)對(duì)這個(gè)問(wèn)題呢?首先,你應(yīng)該審核數(shù)據(jù)庫(kù)的CREATE ANY權(quán)限,刪除其中不需要的那些部分。其次,看看類似于www.securityfocus.com這類的論壇,看看關(guān)于權(quán)限提升的最新漏洞。最后,激活對(duì)某些特定類型數(shù)據(jù)庫(kù)活動(dòng)的審計(jì)功能并沒(méi)有什么壞處,這樣數(shù)據(jù)庫(kù)就能讓你實(shí)現(xiàn)自我保護(hù)。當(dāng)數(shù)據(jù)庫(kù)自行審核類似于GRANT DBA這樣的事件時(shí),你可以通過(guò)查看審計(jì)日志知道有沒(méi)有出現(xiàn)惡意或突發(fā)的活動(dòng)
7. 操作系統(tǒng)指令和安全
黑客并不總是通過(guò)shell命令行提示符登錄到你的系統(tǒng)的。 不過(guò),通過(guò)誘使Oracle數(shù)據(jù)庫(kù)運(yùn)行操作系統(tǒng)水平的指令,我們的確給黑客提供了一條運(yùn)行指令的有效途徑。這些指令能夠刪除和破壞文件、改寫(xiě)日志(以便隱藏他們的行蹤)、創(chuàng)建帳戶,以及其他一些能通過(guò)命令行輸入指令達(dá)成的操作。他們是怎么做到的呢?盡管方法有很多,最容易的一種就是通過(guò)Java和PL/SQL這些程序語(yǔ)言。通??梢岳脛?chuàng)建外部存儲(chǔ)過(guò)程的能力,使之執(zhí)行一個(gè)具備系統(tǒng)調(diào)用功能的存儲(chǔ)程序。這個(gè)系統(tǒng)調(diào)用指令能夠以首次安裝時(shí)使用的oracle帳戶權(quán)限執(zhí)行。
防范此類攻擊的方法
雖然Oracle在保護(hù)用戶免受此類攻擊上已經(jīng)取得了一定進(jìn)展,不過(guò)你最好還是把希望寄托在你的預(yù)防監(jiān)測(cè)工作上。嚴(yán)密留意你的系統(tǒng)內(nèi)部有沒(méi)有出現(xiàn)這類活動(dòng),當(dāng)有攻擊者試圖對(duì)你使用此類惡意攻擊時(shí),你最好能夠事先掌握主動(dòng)權(quán)。
8. 文件系統(tǒng)安全
對(duì)文件系統(tǒng)(filesystem)的訪問(wèn)是一個(gè)讓你頭大的棘手問(wèn)題?!皁racle”操作系統(tǒng)用戶擁有所有Oracle軟件和數(shù)據(jù)庫(kù)數(shù)據(jù)文件的訪問(wèn)權(quán)限,所以如果數(shù)據(jù)庫(kù)內(nèi)部的某些用戶利用UTL_FILE包訪問(wèn)filesystem上的文件時(shí),他們就可以訪問(wèn)之前由于權(quán)限和角色限制而無(wú)權(quán)訪問(wèn)的很多數(shù)據(jù)庫(kù)內(nèi)部文件。
防范此類攻擊的方法
Oracle引入DIRECTORY對(duì)象在防止此類攻擊上也有一定作用。在10g系統(tǒng)中,必須通過(guò)DIRECTORY對(duì)象來(lái)定義某些類型的讀寫(xiě)操作。這意味著用戶必須擁有CREATE DIRECTORY權(quán)限,而在前面介紹的權(quán)限提升問(wèn)題中,我們已經(jīng)看到可以通過(guò)很多方法獲取這種權(quán)限。即使這些也被解決了,還是有很多方法可以通過(guò)PL/SQL或Java語(yǔ)言來(lái)獲取對(duì)filesystem的訪問(wèn)權(quán)限和對(duì)文件的讀寫(xiě)權(quán)限。
總論:
就像上面討論的一樣,Oracle數(shù)據(jù)庫(kù)產(chǎn)品有很多漏洞,有時(shí)候看起來(lái)就像由一些聰明透頂?shù)墓こ處熃ㄔ斓囊凰勒?,工程師固然聰明,但比那些覬覦此宅的黑客們忠厚老實(shí)多了。因此,他們沒(méi)有預(yù)料到有人會(huì)利用這種種方法來(lái)偷磚竊瓦削弱豪宅的根基。黑客可以通過(guò)很多不同的方法進(jìn)行攻擊,侵入到目標(biāo)數(shù)據(jù)庫(kù)。
不過(guò),只要數(shù)據(jù)庫(kù)管理員能夠花點(diǎn)時(shí)間和精力來(lái)解決,其中很多問(wèn)題都是可以避免的。Oracle已經(jīng)針對(duì)很多漏洞在數(shù)據(jù)庫(kù)內(nèi)部打上了補(bǔ)丁,而且入侵監(jiān)測(cè)系統(tǒng)能體構(gòu)額外的安全保障。所以數(shù)據(jù)庫(kù)管理員應(yīng)該對(duì)每一種漏洞都銘記在心,警惕性才是防范的關(guān)鍵,盡量執(zhí)行好自己制定的安全計(jì)劃。
更多信息請(qǐng)查看IT技術(shù)專欄