Oracle密碼儲存和驗證過程剖析及防禦建議

2021-12-29 21:10:23 字數 3857 閱讀 6841

oracle作為目前市場占有率第一的資料庫產品,相比其他資料庫產品,自身存在的漏洞數量也是同類產品之中最多的,而且還在增長。由此,我們可以預見,資料庫安全問題也將長期存在。

談到資料庫安全問題,備受使用者關注的有資料庫密碼安全,專業的說法是資料庫身份驗證過程安全。資料庫密碼是保護庫核心心資料的關鍵,一旦資料庫密碼被竊取,會導致攻擊者對資料庫乃至整個網路更深入的入侵。

攻擊者針對資料庫的身份驗證過程主要採取兩種策略:一種是繞過資料庫身份驗證過程,一種是是攻破資料庫身份驗證過程。本文主要針對後者主動攻破方式進行**。安華金和資料庫攻防實驗室結合oracle資料庫的特點論述攻擊oracle身份驗證過程的辦法,以及針對這些攻擊行為提出防禦建議。

oracle資料庫身份驗證繞過手段

利用oracle的預設密碼和oracle密碼特點破解密碼

獲取oracle密碼的暴力破解方法,除去通用的排列組、字典破解等方式外,oracle 自身存在一些預設使用者名稱密碼,例如智慧型**賬戶dbsnmp/dbsnmp。這是oracle 中最可能被忘記修改的預設使用者名稱和密碼。造成這一現象的原因是智慧型**的密碼需要在兩個不同的地方進行修改,首先要在資料庫中對dbsnmp使用者密碼進行修改,其次需要在snmp_rw.ora這個檔案中再次進行密碼修改。

還有oracle登陸包中會帶有資料庫密碼位數的資訊,這是由於資料庫伺服器和客戶端之間加密協議造成的。在資料庫的登入資訊包中存在乙個關鍵字段auth_password,這個欄位是客戶端對密碼進行加密後傳出的,這個引數的長度和原密碼的長度密切相關。我們以oracle 11g為例這個auth_password的長度是96位預示著密碼明文的長度應該是16-30位之間(oracle密碼長度最大不超過30位)。

下圖中auth_password的長度是64位預示著密碼明文的長度應該是1-15位之間。

這一特點不是11g版本獨有的,oracle所有版本都有類似的特點。通過包中auth_password位數確定密碼的位數,此舉將有效的降低暴力破解的成本。

從oracle本地檔案獲取密碼

雖然可以進行一定的優化,但暴力破解本質還是靠大量的訪問鏈結進行測試。除了暴力破解外還存在著更為簡便的獲得密碼的方法。假設已經可以訪問資料庫所在主機的檔案系統,那麼可以通過oracle的一些本該刪除的檔案獲得資料庫密碼資訊。例如在資料庫四大使用者中sysman的密碼會以密文的形式被寫入到檔案中,但是同時也會把金鑰寫入到同乙個文件中。例如c:\app\lsc\product\11.2.0\dbhome_1\sysman\config下的emoms.properties 中儲存了 sysman的密碼和金鑰。開啟emoms.propeties

圖中畫紅線的位置:

oracle.sysman.eml.mntr.emdreppwd記錄的是sysman的密碼,oracle.sysman.eml.mntr.emdreppwdseed記錄的是對應密碼的金鑰。

同時得到了密文與金鑰用des解密器可以獲得密碼原文

如果資料庫管理中多個賬號採用統一密碼,就會導致直接外洩sys/system密碼。

在oracle主目錄的cfgtoologs資料夾中還存在一些會暴露密碼資訊的檔案。

利用oracle加密原理破解密碼

除了以上兩種獲取密碼的方法外還有更加直接的辦法,這種方法就是通過理解oracle的金鑰傳輸過程破解oracle通訊協議中的密文。(下面以oracle 9i為例說明這一方法,10、11原理類似,只是更加複雜)

首先拿乙個oracle登入包來說明整個過程。首先客戶端給伺服器傳送service_name。

這一傳送過程如果沒有向listener登記該服務,那麼listener會生成乙個錯誤,則終止所有過程。如果成功則進入身份驗證過程,首先客戶端向伺服器傳送乙個含有使用者名稱的資料報,伺服器判斷使用者名稱存在後從資料庫中提取出該使用者名稱的雜湊值,伺服器使用這個雜湊值生成乙個密碼。

這個密碼的生成過程是伺服器呼叫orageneric庫中的函式slgdt()過程。slgdt()函式是用來重新獲得系統時間的,將分鐘、小時、秒、毫秒結合起來形成乙個用來加密的8個位元組的「文字」。文字的前四位是由分鐘和小時與使用者名稱對應的雜湊的後四位進行異或運算得出,文字的後四位是由秒和毫秒與使用者名稱對應的雜湊的前四位進行異或運算得出。

加密過程通過呼叫oracommon庫中的函式kzsrenc(),使用該金鑰對文字進行加密。通過使用函式lncgks(),函式kzsrenc()基本完成了des金鑰的生成,最後利用函式incecb()輸出ecb模式下的des密文,這裡生成的密文就是密碼。接著再次呼叫函式kzsrenc(),利用使用者的密碼雜湊值對該密碼加密,這樣呼叫的結果就是auth_sesskey然後傳送給客戶端。

收到auth_sesskey後,客戶端將其重新解密並重新獲得該密碼。使用者利用oracore庫中的函式lncupw()建立自己密碼雜湊值的乙個副本,然後通過呼叫函式kzsrdec(),將該雜湊值用作對auth_sesskey進行解密的金鑰。這一過程順利完成後就會生成密碼。

這個密碼通過呼叫函式kzsrenp()作為金鑰對其中的明文、大小寫敏感字元進行加密。kzsrenp()函式完成了des金鑰的生成以及在cbc模式下使用者密碼的加密。接下來,密文以auth_password的形式被送回伺服器。

伺服器呼叫oracommon庫中的函式kzsrdep(),利用金鑰密碼對auth_password進行解密,這個時候伺服器就擁有了明文密碼的乙個副本,然後伺服器建立密碼的雜湊值並將它與資料庫中的雜湊值進行比較,如果匹配成功,那麼使用者就完成了整個身份驗證。

清楚這裡面的原理就可以按照oracle的思路在網路上嗅探到auth_sesskey和auth_password,然後利用暴力破解破解出雜湊值,最終利用雜湊值解密auth_sesskey獲得密碼。

知道了攻擊者獲取資料庫密碼的辦法,就可以有針對性的對其進行防禦。從攻擊方法上看,第一種方法主要是依賴預設口令或弱口令;第二種方法是配置檔案洩漏;第三種方法是通過破解雜湊值獲取。

根據安華金和攻防實驗室專家多年經驗以下3點有助於加固oracle密碼安全,解決攻擊者對oracle驗證繞過的威脅。

oracle身份認證加固建議

定期修改賬戶的密碼

在資料庫建立之後會存在一些預設使用者,例如文中提到的智慧型**賬號dbsnmp。要定期對這些使用的賬號進行修改密碼。金鑰要遵循oracle的建議,並且理論上密碼越複雜越有利於安全。

鎖死一些不需要的使用者,對系統檔案進行加鎖處理

例如文中的檔案系統中暴露的是sysman的密碼,這個賬號是用於管理em的賬號,如果你的環境不需要em,請鎖死這個賬號,並對一些可能洩露密碼的配置檔案進行檔案加鎖,防止本地檔案系統被入侵牽連到資料庫。

提高資料庫版本,使用非定值的雜湊值

10g之前的資料庫由於固定使用者名稱對應的雜湊值是固定的僅依靠時間函式做調整,這就給攻擊者對資料庫雜湊值做暴力破解帶來了可能。建議公升級資料庫到11g版本,11g開始引入了auth_vfr_data這個隨機值,並對auth_sesskey的生成做了更複雜的調整有利於防止密碼通過洩露的傳輸資訊被破譯。

相信只要做到以上三點,就可以有效的防止攻擊者獲取資料庫密碼。

Oracle儲存過程和儲存函式

參看 oracle儲存過程 儲存函式 說明 儲存過程 儲存函式都是物件。包括表 檢視 索引 序列 同義詞等也是物件。概念 指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存 過程 儲存函式。特點 完成特定功能的程式。區別 儲存函式可以通過return子句返回乙個值。建立和使用儲存過程 用create...

Oracle和SQL Server儲存過程的不同

一 多表連線查詢,更新儲存過程 sql儲存過程 alter procedure dbo getevent scswid nvarchar 20 null todate datetime fromdate datetime asselect notes.note id,notes.note,scsw ...

oracle儲存過程和job

儲存過程 把t ckeck ews表中的資料插入his t neop cmd instance中,把t ckeck ews表資料插入his t ckeck ews要求工單超過5分鐘沒處理置失敗 create or replace procedure p back up ckeckews isewsi...