ANONYMOUS用户默认密码为ANONYMOUS且账户OPEN,拥有CONNECT角色及潜在高危权限(如CREATE TABLE),可通过HTTP漏洞被利用;应立即锁定账户、撤销非必要权限并审计实际授权。

ANONYMOUS用户默认能做什么?为什么危险?
Oracle 的 ANONYMOUS 用户默认密码是 ANONYMOUS,且账户状态为 OPEN(未锁定)。它被设计用于 HTTP 协议下的匿名 Web 访问(如早期 Oracle XML DB 的 HTTP 服务),但**不意味着它权限很小**。该用户拥有 CONNECT 角色,而 CONNECT 在旧版本中隐含 CREATE SESSION、CREATE TABLE、CREATE VIEW 等权限——这意味着攻击者一旦通过 HTTP 接口(如 XDB listener)触发身份绕过或弱配置漏洞,就能以该用户身份创建临时对象、读取部分数据字典,甚至配合其他漏洞提权。
如何确认ANONYMOUS当前是否真有高危权限?
不能只看角色,必须查实际授予的系统权限和对象权限:
- 执行
SELECT * FROM dba_sys_privs WHERE grantee = 'ANONYMOUS';—— 查看直接授予的系统权限 - 执行
SELECT * FROM dba_role_privs WHERE grantee = 'ANONYMOUS';—— 查看其拥有的角色(如CONNECT、RESOURCE) - 执行
SELECT * FROM dba_tab_privs WHERE grantee = 'ANONYMOUS';—— 查看对具体对象(如DUAL、ALL_USERS)的显式授权
特别注意:Oracle 12c+ 默认 CONNECT 角色已大幅精简,但若数据库是从老版本升级而来,或 DBA 手动补授过权限,ANONYMOUS 可能仍保留 CREATE TABLE 或 SELECT ANY DICTIONARY 这类高危权限。
安全回收步骤:从禁用到最小化
回收不是“删掉”,而是分层控制:
-
立即锁定账户:
ALTER USER ANONYMOUS ACCOUNT LOCK;—— 这是最快速有效的阻断手段,不影响 XDB 功能(XDB 可通过其他方式处理匿名请求) -
撤销非必要角色:
REVOKE CONNECT FROM ANONYMOUS;—— 如果业务确认不需要任何会话能力,这是关键一步 -
清理残留系统权限:
REVOKE CREATE TABLE, CREATE VIEW, UNLIMITED TABLESPACE FROM ANONYMOUS;—— 避免角色被误授后遗留的权限 -
检查并关闭 XDB HTTP 监听(可选):
EXEC DBMS_XDB.SETHTTPPORT(0);—— 若系统不提供 Web 服务,彻底关闭端口比依赖用户权限更可靠
容易忽略的兼容性坑
某些老旧 Web 应用或中间件(如 Oracle Portal 10g 遗留模块)可能硬编码依赖 ANONYMOUS 登录。直接锁账户会导致 404 或 ORA-1017 错误。此时应:
- 先用
SELECT username, account_status FROM dba_users WHERE username = 'ANONYMOUS';确认当前状态,避免重复操作 - 不要仅靠
REVOKE CONNECT就认为安全——在 Oracle 11g 及以前,CONNECT不含CREATE SESSION,但ANONYMOUS可能被单独授过该权限,必须查dba_sys_privs - 回收后务必测试 HTTP 接口是否仍满足业务需求;若必须保留,至少确保监听地址绑定内网 IP、防火墙限制源 IP,并启用
SEC_CASE_SENSITIVE_LOGON=TRUE防止大小写爆破
真正危险的从来不是账户本身,而是它被当成“无害默认值”而长期无人审计。每次打补丁或升级后,都该重新跑一遍 dba_users_with_defpwd 和 dba_sys_privs 检查。


















