首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

駭客視角審視 Oracle 資料庫安全:監聽器、SQL 注入、PL/SQL 弱點與作業系統滲透

     編輯:Oracle 資料庫基礎

Oracle 安全現狀

  • 媒體調查:>10% 互聯網資料庫存在安全隱患,750 家開發商表達憂慮。
  • 駭客大會 (BlackHat, DefCon) 頻現資料庫攻擊議題:Alpha Voyager、Spida Worm、Oracle 白皮書漏洞利用代碼。
  • 防火牆後並不安全:多數妥協源於內部,內部威脅最致命,非特權用戶同樣可發起攻擊。

一、監聽器服務 — 入口關卡

脆弱性根源

  • 監聽器分離鑑別與審計,以獨立進程 (UID) 執行,接受遠程命令執行外部任務。
  • 預設**無密碼**,任意人可發送 STOP, SET, SAVE_CONFIG 等命令。

加固清單

  1. 設定強密碼 (8+ 位、字母數字特殊字元混合):
    LSNRCTL> SET PASSWORD
    Password: ********
    The command completed successfully
    LSNRCTL> SAVE_CONFIG
    
  2. 保護 listener.ora (密碼以雜湊存儲),限制檔案權限 chmod 600。
  3. **禁用遠程管理**:密碼網路傳輸明文,易被竊聽。僅本機 LSNRCTL 管理。
  4. 移除預設 EXTPROC 端點 (9i+ 預設不建立),防止任意 DLL/共享庫載入執行 OS 命令。

監聽器封包分析與攻擊向量

  • 緩衝區溢出:連接字串欄位 (USER, SERVICE, COMMAND) 超長導致棧覆蓋 (8.1.7 COMMAND>1K 崩潰, 9.0.1 SERVICE>1K 崩潰)。
  • 封包頭偽造:修改封包長度欄位,誘導監聽器返回超長響應,洩露記憶體殘留資料 (用戶名、SQL 片段)。
  • 命令竊聽:網路明文傳輸 SET PASSWORD 等敏感操作。

二、Web 應用 SQL 注入 — 繞過防火牆的利刃

原理

應用拼接用戶輸入構建 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'
-- 永真條件繞過認證

進階:UNION 注入竊取敏感表

ProductName: test' UNION SELECT username, password FROM dba_users WHERE 'a'='a
-- 需匹配欄位數與型別,錯誤回顯 (欄位數不匹配、型別不符) 可作偵察依據

防禦鐵律

  1. **強制參數化查詢 / 繫結變數** (PreparedStatement, CallableStatement)。
  2. 輸入驗證:白名單、長度、型別、編碼規範。
  3. 錯誤訊息不回顯給前端 (自定義錯誤頁)。
  4. 最小權限原則:Web 連線布號僅擁有必要表的 SELECT/INSERT/UPDATE/DELETE,無 DBA/創建物件權限。
  5. WAF (Web Application Firewall) 作為第二道防線。
  6. 制定編碼規範,Code Review 必查 SQL 拼接。

三、資料庫層面漏洞

預設密碼未修改

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;

PUBLIC 權限過度

REVOKE SELECT ON all_users FROM PUBLIC; 等最小化授權。

動態 SQL 注入 (PL/SQL)

-- 危險寫法
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。

四、從資料庫滲透到作業系統

  • Windows: Oracle 服務以 LocalSystem 權限運行 (相當 SYSTEM)。
  • Unix: Oracle 軟體擁有者帳號 (通常 oracle) 權限。
  • 關鍵套件:UTL_FILE (讀寫檔案)、UTL_HTTP (發起 HTTP)、DBMS_SCHEDULER (外部作業)、CREATE LIBRARY + EXTERNAL PROCEDURES (載入任意 DLL/.so)。
  • SetUID 二進制風險 (Unix):oracle 主程式、tnslsnr、cmctl 等歷史 SetUID root 檔案可被利用提權。建議移除非必要 SetUID,限制執行權限 chmod 750、屬主 oracle:oinstall。

五、安裝階段安全

  • /tmp 目錄競態條件:攻擊者預建惡意檔案/連結,安裝程式以 root 權限寫入/執行。
  • 對策:安裝前鎖定非必要 OS 帳號、指定安全 TMPDIR、鎖定 ORACLE_HOME 權限、移除所有 SetUID bit、重命名 oracle 執行檔 (極端加固)。

結語

資料庫安全是分層防禦體系:網路層 (監聽器加固)、應用層 (參數化查詢)、資料庫層 (最小權限、密碼策略、審計)、作業系統層 (權限收斂、SetUID 清理)、安裝部層 (臨時目錄隔離)。**駭客只需找到一個薄弱環節,防禦者必須守住每一層。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved