oracle 11g起可通过dba_users_with_defpwd视图直接查询使用默认密码的用户,执行select username from dba_users_with_defpwd即可;该视图由oracle动态维护,用户修改密码后自动移除,但仅适用于官方预置账号,不涵盖自定义用户弱密码。
直接查 dba_users_with_defpwd 视图(oracle 11g 及以后)
这是最简单、最可靠的方式,oracle 自 11g 起内置了该视图,专门用来标记仍使用默认密码的用户。它不依赖密码哈希比对,而是由 oracle 内部机制动态维护——只要用户改过密码,就会自动从该视图中消失。
执行以下语句即可列出全部风险账号:
SELECT username FROM dba_users_with_defpwd;
注意:DBA_USERS_WITH_DEFPWD 视图只在数据库启用了密码复杂度策略(如 SEC_CASE_SENSITIVE_LOGON=TRUE)且用户未显式修改过密码时才准确;如果 DBA 手动用 ALTER USER ... IDENTIFIED BY VALUES 复用了某个默认哈希值,该视图不会识别——此时需靠哈希比对兜底。
手动比对 PASSWORD 字段哈希值(兼容所有版本,含 10g 及更早)
当目标库是 10g 或未启用 11g+ 的默认密码检测机制时,必须回退到哈希比对。Oracle 存储的是 DES 加密后的密码哈希(小写十六进制字符串),不是明文。
-
dba_users表的PASSWORD列存储的就是这个哈希值 - 常见默认账号哈希值已固化(如
scott是F894844C34402B67,sys是D4C5016086B2DC6A) - 查询时务必用
IN列表精确匹配,避免模糊或大小写错误
示例语句:
SELECT username, account_status, created FROM dba_users WHERE password IN ( 'F894844C34402B67', -- scott 'D4C5016086B2DC6A', -- sys 'D4DF7931AB130E37', -- system 'E066D214D5421CCC', -- dbsnmp '72979A94BAD2AF80' -- mdsys );
⚠️ 容易踩的坑:PASSWORD 列在 12c 及以后版本对普通用户不可见(仅 SYS 可查),且 12.2+ 启用统一审计后,部分旧哈希可能不再生成——若查不到结果,别急着认为“安全”,先确认版本和权限。
查出账号后,必须立刻判断是否可删/锁/改
不能只看用户名就下结论。有些账号虽在默认列表里,但业务强依赖(比如 DBSNMP 用于 OEM 监控),盲目锁定会导致监控中断。
-
SCOTT、HR、OE、SH:示例用户,无真实业务时应直接ALTER USER scott ACCOUNT LOCK PASSWORD EXPIRE -
DBSNMP、OUTLN、XDB:功能型账号,若不用对应组件(如 XML DB、OLAP),锁定比改密更稳妥 -
SYS、SYSTEM:必须改密,不能锁;密码强度需满足password_verify_function策略 -
CTXSYS、MDSYS:空间/全文索引组件用户,确认是否启用相关功能再处置
执行前建议先导出当前状态:
SELECT username, account_status, lock_date, expiry_date FROM dba_users WHERE username IN ('SCOTT','DBSNMP','CTXSYS');
别漏掉被忽略的隐性风险点
真正危险的往往不是标准默认账号,而是那些被遗忘的、长期未登录却保持 OPEN 状态的测试账号——它们可能被设为默认密码后从未改过。
建议组合筛查:
- 查所有
account_status = 'OPEN'且created 的账号,人工复核是否仍需存在 - 查
dba_users中password为空(NULL)的记录——说明启用了外部认证(OS auth),但若同时允许密码登录,就是配置冲突 - 检查
default_tablespace和temporary_tablespace是否为SYSTEM或SYSAUX,这类账号大概率是早期遗留的“半成品”
最后提醒一句:DBA_USERS_WITH_DEFPWD 不会包含你自己创建的用户,哪怕你设了 IDENTIFIED BY tiger ——它只认 Oracle 官方预置账号的默认哈希。自定义用户的弱密码,得靠审计策略或第三方工具抓。











