【漏洞-Oracle】未设置口令复杂度校验、密码有效期

devtools/2024/12/25 0:24:25/

1.场景描述

三方漏洞扫描: 

2.详细描述

       安全问题:Oracle未设置系统的口令复杂度校验、密码有效期。

       危害分析结果:存在使用口令被恶意用户猜测获得,合法用户身份被仿冒,导致系统被非授权访问的可能性。

       整改建议:建议根据需要对系统用户口令设置复杂度限制,口令的复杂度(8位以上、至少字母、数字、符号等混合组成)并更换周期进行合理设置(90天以内),不允许新设定的口令与前次旧口令相同。

       涉及对象: Oracle。 

3.方案分析

查询后得知:可通过配置密码复杂度策略解决。
       Oracle数据库通过Profile来管理密码策略。默认情况下,数据库中有一个默认Profile:DEFAULT。我们可以修改这个默认的Profile,或者创建一个新的Profile并将其应用到需要的用户中。

        在profile中可配置,通过LIMIT子句可设置多个密码策略,如密码有效期、密码错误n次后锁定用户、密码错误后锁定的天数、密码是否可和之前一样、密码可一样几次、密码到期后可使用的天数、密码复杂度等。其中,密码复杂度验证可以用默认函数,可以根据需要自定义一个密码验证函数。

            为了不影响原有用户,本文创建一个新Profile 进行测试。 步骤:

           1)创建一个新profile:taiy_secure_profile,指定各种策略。

                 创建一个新密码验证函数:taiy_verify_function(8位以上,含字母、数字、符号等)。

           2)将这个配置文件分配给特定的数据库用户,使得该用户的密码将受到这些策略的约束。

4.问题处理

4.1查询

[oracle@neptune ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 19 22:13:13 2024
Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SYS@orcl> alter session set container=orclpdb1;Session altered.

1)查看oracle 用户密码管理策略

select DISTINCT PROFILE from dba_users ;

SYS@orcl> select DISTINCT PROFILE from dba_users t ;PROFILE
---------
DEFAULTSYS@orcl>

 结果截图: 策略都为DEFAULT 

2)查看默认密码策略里的配置

命令:
SELECT * FROM dba_profiles WHERE resource_type='PASSWORD' ;

结果截图:

3) 查看密码复杂度校验

SELECT PROFILE,LIMIT FROM dba_profiles T WHERE resource_type='PASSWORD' AND T.resource_name='PASSWORD_VERIFY_FUNCTION'
order by 1,2

结果截图: 

 

     说明:Limit 列的值为null 表示未启用密码验证函发功能;

               如果返回值为函数名称,如:VERIFY_FUNCTION 则表示启用验证函数功能。

4.2 创建新 密码验证函数:taiy_verify_function

     密码复杂度要求:如8位以上,必须包含字母、数字、符号。

CREATE OR REPLACE FUNCTION taiy_verify_function (username IN VARCHAR2,password IN VARCHAR2,old_password IN VARCHAR2
) RETURN BOOLEAN ISl_min_length CONSTANT NUMBER := 8;l_has_upper BOOLEAN := FALSE;l_has_lower BOOLEAN := FALSE;l_has_zm   BOOLEAN := FALSE;l_has_digit BOOLEAN := FALSE;l_has_special BOOLEAN := FALSE;l_char CHAR(1);
BEGIN-- 检查密码长度IF LENGTH(password) <= l_min_length THENRAISE_APPLICATION_ERROR(-20001, 'Password is too short');END IF;-- 遍历密码字符,检查是否包含大写字母、小写字母、数字和特殊字符/* FOR i IN 1 .. LENGTH(password) LOOPl_char := SUBSTR(password, i, 1);IF REGEXP_LIKE(l_char, '[A-Z]') THENl_has_upper := TRUE;ELSIF REGEXP_LIKE(l_char, '[a-z]') THENl_has_lower := TRUE;ELSIF REGEXP_LIKE(l_char, '[0-9]') THENl_has_digit := TRUE;ELSIF REGEXP_LIKE(l_char, '[^a-zA-Z0-9]') THENl_has_special := TRUE;END IF;END LOOP;*/IF REGEXP_LIKE(password, '[A-Z]') THENl_has_upper := TRUE;END IF;IF REGEXP_LIKE(password, '[a-z]') THENl_has_lower := TRUE;END IF;IF l_has_upper OR l_has_lower THENl_has_zm := TRUE;END IF;IF REGEXP_LIKE(password, '[0-9]') THENl_has_digit := TRUE;END IF;IF REGEXP_LIKE(password, '[^a-zA-Z0-9]') THENl_has_special := TRUE;END IF;-- 检查是否满足所有复杂度要求IF NOT l_has_zm OR NOT l_has_digit OR NOT l_has_special THENRAISE_APPLICATION_ERROR(-20002, 'Password does not meet complexity requirements');END IF;-- 其他检查(例如,密码不能与用户名、服务器名等相同)-- ...RETURN TRUE;
EXCEPTIONWHEN OTHERS THENRETURN FALSE;
END;
/GRANT EXECUTE ON taiy_verify_function TO PUBLIC container=current;create or replace function my_password_test( username varchar2,password varchar2,old_password varchar2)return boolean ISdiffer integer;
beginif not ora_complexity_check(password, chars => 8, upper => 1, lower => 1,digit => 1, special => 1) then return(false);end if;-- Check if the password differs from the previous password by at least-- 6 charactersif old_password is not null then differ := ora_string_distance(old_password, password);if differ < 3 thenraise_application_error(-20033, 'The new password should differ '|| 'from the previous password by '|| 'at least 4 characters.');end if;end if;return(true);
end;
/GRANT EXECUTE ON my_password_test TO PUBLIC container=current;

     查找资料:ORACLE的默认密码复杂度函数位置:$ORACLE_HOME/rdbms/admin下utlpwdmg.sql脚本中,有兴趣的可以看下。因此可将此函数写入该sql中,或者在任何位置执行sql创建函数即可。本文在该位置创建sql文件:taiy_verify_function.sql,赋予权限,执行。

     @?/rdbms/admin/feng_verify_function.sql

/home/u01/app/oracle/product/19.3.0/dbhome_1/rdbms/admin/
-- 执行utlpwdmg.sql脚本  
--"?"是一个占位符,代表Oracle的环境变量,代表Oracle的home目录。
--@ 是调用脚本标识,@后面直接写脚本的完整路径及...

执行结果:

 

4.3 创建新 profile: taiy_secure_profile,指定各种策略

含义:
FAILED_LOGIN_ATTEMPTS 10  --密码错误尝试次数,超过后被锁定
PASSWORD_LIFE_TIME 90        --密码有效期90天
PASSWORD_REUSE_TIME UNLIMITED     --指定了口令不能重用前的天数:30天内不能重复使用旧密码
PASSWORD_REUSE_MAX  UNLIMITED     --重复使用旧密码的最大次数:如3
PASSWORD_LOCK_TIME 1      --登录尝试失败达到指定次数,用户锁定天数
PASSWORD_GRACE_TIME 7     /*--表示密码到期后可以延续使用的天数,
                          并且可延续时间内登录会有相应口令即将过期的提示。*/
PASSWORD_VERIFY_FUNCTION taiy_verify_function;          

执行: 

CREATE  PROFILE taiy_secure_profile LIMIT
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX  UNLIMITED
PASSWORD_LOCK_TIME  1
PASSWORD_GRACE_TIME 7
PASSWORD_VERIFY_FUNCTION taiy_verify_function;

4.4 将配置文件分配给特定用户,使其密码将受策略约束

执行:-- 将该配置文件分配给用户

ALTER USER NH_AML PROFILE taiy_secure_profile;

执行后,查看结果:

 

4.5 验证结果

[oracle@neptune admin]$ pwd
/home/u01/app/oracle/product/19.3.0/dbhome_1/rdbms/admin

 提示:

试了10次密码 失败后,再次登录正确密码,提示锁定

5.知识总结

CREATE PROFILE     taiy_secure_profile    LIMIT
FAILED_LOGIN_ATTEMPTS 10  --密码错误尝试次数,超过后被锁定
PASSWORD_LIFE_TIME 90        --密码有效期90天
PASSWORD_REUSE_TIME UNLIMITED     --指定了口令不能重用前的天数:

                                                                          如:30天内不能重复使用旧密码
PASSWORD_REUSE_MAX  UNLIMITED     --重复使用旧密码的最大次数:如3
PASSWORD_LOCK_TIME 1                         --登录尝试失败达到指定次数,用户锁定天数
PASSWORD_GRACE_TIME 7                    /*--表示密码到期后可以延续使用的天数,
                                                         并且可延续时间内登录会有相应口令即将过期的提示。*/
PASSWORD_VERIFY_FUNCTION taiy_verify_function;


http://www.ppmy.cn/devtools/145117.html

相关文章

WPF 依赖属性和附加属性

除了普通的 CLR 属性&#xff0c; WPF 还有一套自己的属性系统。这个系统中的属性称为依赖属性。 1. 依赖属性 为啥叫依赖属性&#xff1f;不叫阿猫阿狗属性&#xff1f; 通常我们定义一个普通 CLR 属性&#xff0c;其实就是获取和设置一个私有字段的值。假设声明了 100 个 …

leetcode hot100 轮转数组

189. 轮转数组 已解答 中等 相关标签 相关企业 提示 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮…

homebrew,gem,cocoapod 换源,以及安装依赖

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 再按照成功提示配置环境变量 ruby 更新ruby到最新 brew install ruby 如果安装了会自动升级 安装完成后根据提示配置环境变量 再执行命令使其生效 s…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会&#xff0c;法律服务的需求日益增长&#xff0c;但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题&#xff0c;通过线上平台&#xff0c;用户可以轻松搜索、比较和选择合适的律师&#x…

大数据实验三

Python and anaconda 实验三数据预处理和轨迹聚类参考地址&#xff1a; https://www.hifleet.com/wp/communities/data/hangyundashujujishukechengshiyanzhinanshujuyuchulijiguijijuleichixugengxinzhong#post-2212https://www.hifleet.com/wp/communities/data/hangyundas…

Nginx负载均衡(upstream)

Nginx负载均衡(upstream) upstream 主要是配置均衡池和调度方法 proxy_pass 主要是配置代理服务器ip或服务器组的名字 upstream testTomcat{​​​​server 127.0.0.1:81 weight=1;​​​​server 127.0.0.1:82 weight=1;​​​​server 127.0.0.1:83 weight

实现服务器实时备份常用方案和方法

服务器的实时备份是确保数据安全、避免灾难恢复失败的重要措施。在进行数据备份时&#xff0c;必须考虑到多个方面&#xff0c;包括数据的保护、恢复时间以及灾难恢复的能力。实现实时备份可以防止由于硬件故障、网络攻击(如勒索病毒)、自然灾害等原因导致数据丢失。以下是实现…

使用插件时要注意

在使用插件时&#xff0c;需要注意一些关键事项&#xff0c;确保插件能够稳定、安全地工作&#xff0c;并且不会给系统带来风险或负担。以下是使用插件时需要注意的几个重要方面&#xff1a; 1. 插件来源与信任度 官方渠道与可靠来源&#xff1a;总是选择来自官方网站、知名平…