private的db link可以查到密码, public 的dblink 也可以看到密码。只是需要用sys用户登录查询。
查询dblink的user 密码,用sys 登陆
SELECT * FROM SYS.link$;
SELECT *
FROM SYS.link$ l, SYS.user$ u
WHERE l.owner# IN (SELECT kzsrorol
FROM x$kzsro) AND l.owner# = u.user#;
如果是private 的dblink,就可以用owner登录,查询 user_db_links
Select * from user_db_links;
db link泄露密码的处理
在Oracle 10g前,我们可以通过查看user_db_links视图,来查看到本用户下建立的db link的
username和password.原因比较简单,可以认为是Oracle的一个安全漏洞。我们看看user_db_links的创建过程就明白了:
create or replace view user_db_links(db_link, username, password, host, created)
as
select l.name, l.userid, l.password, l.host, l.ctime
from sys.link$ l
where l.owner# = userenv('SCHEMAID')
select * from link$
user_db_links视图来源于sys.link$字典表,而在10g前, 对拥有select any table权限的用户来说,是可以访问link$表的。所以要想规避这个漏洞,必须做如下2个操作
1)revoke select any table 或更高级的权限或角色[比如DBA等]
2)重建user_db_link视图
create or replace view user_db_links(db_link, username,host, created)
as
select l.name, l.userid, l.host, l.ctime from sys.link$ l where l.owner# = userenv('SCHEMAID')
在Oracle 10g中,Oracle公司也认识到了这个bug,修正了sys.link$的访问权限,除非拥有sysdba权限,否则谁也访问不了。在user_db_links也看不到password