当前位置: 安全纵横 > 安全公告

Oracle CHECK_DB_PASSWORD函数SQL Injection漏洞

名称:SQL Injection Vulnerability in Oracle CHECK_DB_PASSWORD

涉及系统:Oracle APEX

安全级别:中风险

类型:SQL Injection

厂商URL :www.oracle.com

发现者 :Alexander Kornbrust

公告时间:17 July 2007 (V 1.00)

细节: wwv_flow_security.check_db_password函数存在一个SQL 注入漏洞. Oracle数据库使用ALTER USER命令来修改数据库用户的密码,但是在处理过程做忽略了对输入密码的检查确认。APEX 3.0.1或者更高的版本已经修复了该漏洞

以前的代码:

FUNCTION CHECK_DB_PASSWORD (P_USER_NAME VARCHAR2, P_PASSWORD VARCHAR2) RETURN BOOLEAN IS

BEGIN

IF P_USER_NAME IS NULL OR P_PASSWORD IS NULL THEN

  RETURN FALSE;

END IF;

BEGIN

  EXCEPTION

  WHEN NO_DATA_FOUND THEN RETURN FALSE;

END;

BEGIN

  EXCEPTION

  WHEN NO_DATA_FOUND THEN RETURN FALSE;

END;

L_STMT:= 'ALTER USER "' || P_USER_NAME || '" IDENTIFIED BY "' || P_PASSWORD||'"';

EXECUTE IMMEDIATE L_STMT;

 

新的代码:

Oracle 现在已经对输入密码进行了长度检测(30个字符). 我很想知道这个限制在11g中是不是已经达到了50个字符。输入确认的以部分代码设计的很傻。如果输入的字符串中包含char(34)那么Oracle将报出错误信息。可是chr(34) 并没有被执行. 如果该代码执行后,将会很容易得绕过限制。(e.g. chr( 34) or chr(34 ) or chr(35-1) or ...)

FUNCTION CHECK_DB_PASSWORD (P_USER_NAME VARCHAR2, P_PASSWORD VARCHAR2) RETURN BOOLEAN IS

BEGIN

IF P_USER_NAME IS NULL OR P_PASSWORD IS NULL THEN

  RETURN FALSE;

END IF;

IF LENGTH(P_PASSWORD) > 30 OR INSTR(P_PASSWORD,'"') > 0 OR INSTR(LOWER(P_PASSWORD),'chr(34)') > 0 THEN

  RETURN FALSE;

END IF;

 

BEGIN

  EXCEPTION

  WHEN NO_DATA_FOUND THEN RETURN FALSE;

END;

BEGIN

  EXCEPTION

  WHEN NO_DATA_FOUND THEN RETURN FALSE;

END;

L_STMT:= 'ALTER USER "' || P_USER_NAME || '" IDENTIFIED BY "' || P_PASSWORD||'"';

EXECUTE IMMEDIATE L_STMT;

 

受影响的产品:

这个漏洞已经在 APEX 3.0.1中修补但并没有在CPU July 2006补丁包中。所以将你的APE升级到3.0.1或者更高版本是很有必要的。

补丁信息:这个漏洞已经在APEX 3.01或者更高版本中修复

历史:

07-may-2007 Oracle 安全部门注意到该漏洞

07-may-2007 漏洞被证实

29-jun-2007 发布 apex 3.0.1

17-jul-2007 Oracle 发布CPU July 2007 补丁包,该补丁包中包含了apex3.0.1

17-jul-2007发布公告