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