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