STOP, SET, SAVE_CONFIG 等命令。LSNRCTL> SET PASSWORD
Password: ********
The command completed successfully
LSNRCTL> SAVE_CONFIG
listener.ora (密碼以雜湊存儲),限制檔案權限 chmod 600。LSNRCTL 管理。EXTPROC 端點 (9i+ 預設不建立),防止任意 DLL/共享庫載入執行 OS 命令。SET PASSWORD 等敏感操作。應用拼接用戶輸入構建 SQL,未參數化。攻擊者注入 UNION SELECT 竊取 DBA_USERS 密碼雜湊離線破解。
-- 原始 JSP
String sql = "SELECT * FROM WebUsers WHERE Username='" + request.getParameter("username")
+ "' AND Password='" + request.getParameter("password") + "'";
-- 攻擊輸入
Username: Bob
Password: Aa' OR 'A'='A
-- 產生 SQL
SELECT * FROM WebUsers WHERE Username='Bob' AND Password='Aa' OR 'A'='A'
-- 永真條件繞過認證
ProductName: test' UNION SELECT username, password FROM dba_users WHERE 'a'='a
-- 需匹配欄位數與型別,錯誤回顯 (欄位數不匹配、型別不符) 可作偵察依據
SYS, SYSTEM, DBSNMP, OUTLN, MDSYS, SCOTT 等預設帳號密碼 (或鎖定狀態) 必須安裝後立即修改/鎖定/過期。
-- 預設無鎖定、無過期
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME 180
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
PASSWORD_VERIFY_FUNCTION verify_function_11G;
REVOKE SELECT ON all_users FROM PUBLIC; 等最小化授權。
-- 危險寫法
CREATE PROCEDURE bad_coding (new_pwd VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'UPDATE app_users SET password = ''' || new_pwd || ''' WHERE username = ''' || USER || '''';
END;
-- 攻擊輸入
EXEC bad_coding('test'', admin=1, full_name=''hacked');
-- 產生: UPDATE app_users SET password = 'test', admin=1, full_name='hacked' WHERE username = 'SCOTT'
修正:使用 EXECUTE IMMEDIATE ... USING new_pwd 繫結變數,或 DBMS_SQL 繫結 API。
UTL_FILE (讀寫檔案)、UTL_HTTP (發起 HTTP)、DBMS_SCHEDULER (外部作業)、CREATE LIBRARY + EXTERNAL PROCEDURES (載入任意 DLL/.so)。oracle 主程式、tnslsnr、cmctl 等歷史 SetUID root 檔案可被利用提權。建議移除非必要 SetUID,限制執行權限 chmod 750、屬主 oracle:oinstall。/tmp 目錄競態條件:攻擊者預建惡意檔案/連結,安裝程式以 root 權限寫入/執行。TMPDIR、鎖定 ORACLE_HOME 權限、移除所有 SetUID bit、重命名 oracle 執行檔 (極端加固)。資料庫安全是分層防禦體系:網路層 (監聽器加固)、應用層 (參數化查詢)、資料庫層 (最小權限、密碼策略、審計)、作業系統層 (權限收斂、SetUID 清理)、安裝部層 (臨時目錄隔離)。**駭客只需找到一個薄弱環節,防禦者必須守住每一層。**