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

Oracle SQL 注入與 PL/SQL 注入防範實戰

     編輯:Oracle 資料庫基礎

漏洞示例:動態 DDL 預存過程

CREATE OR REPLACE PROCEDURE Disable_Constraint (
    P_CONSTRAINT_NAME VARCHAR2,
    P_TABLE VARCHAR2
) AUTHID CURRENT_USER AS
    P_SCHEMA VARCHAR2(32) := USER;
    SQL_STMT VARCHAR2(2000) := 'ALTER TABLE ' || P_SCHEMA || '.' || P_TABLE
                              || ' DISABLE CONSTRAINT ' || P_CONSTRAINT_NAME;
BEGIN
    EXECUTE IMMEDIATE SQL_STMT;
END;

三大注入點:P_TABLE、P_CONSTRAINT_NAME、P_SCHEMA (USER 可被構造)。

防禦策略優先級

  1. 靜態 SQL:能不用動態 SQL 就不用
  2. 綁定變量:EXECUTE IMMEDIATE ... USING ... (僅適用 DML,不適用 DDL 對象名)
  3. 輸入驗證/清洗:DBMS_ASSERT 包 (DDL 場景唯一選擇)

DBMS_ASSERT 包核心函數

函數用途適用場景
SIMPLE_SQL_NAME驗證簡單 SQL 標識符 (無雙引號)對象名不含特殊字符
QUALIFIED_SQL_NAME驗證帶 Schema 的標識符Schema.Object 格式
SCHEMA_NAME驗證現有 Schema 名防二次攻擊 (需對象已存在)
SQL_OBJECT_NAME驗證現有 SQL 對象名同上,含類型檢查
ENQUOTE_NAME雙引號包裹標識符,可選大寫轉換通用首選,防注入最強
ENQUOTE_LITERAL單引號包裹字面量字符串字面量

方案選型邏輯

  • SIMPLE/QUALIFIED_SQL_NAME:要求輸入含雙引號,但數據字典查出的名稱不帶引號 → **不適用**
  • SCHEMA_NAME/SQL_OBJECT_NAME:要求對象已存在,若攻擊者預先創建惡意對象 → **存在二次注入風險**
  • ENQUOTE_NAME:直接雙引號包裹,若包裹後仍含危險字符則拋異常 → **最通用、最安全**

修復後代碼

CREATE OR REPLACE PROCEDURE Disable_Constraint (
    P_CONSTRAINT_NAME VARCHAR2,
    P_TABLE VARCHAR2
) AUTHID CURRENT_USER AS
    P_SCHEMA VARCHAR2(32) := SYS.DBMS_ASSERT.ENQUOTE_NAME(USER, FALSE);
    SAFE_TABLE VARCHAR2(32);
    SAFE_CONSTRAINT VARCHAR2(32);
    SQL_STMT VARCHAR2(2000);
BEGIN
    SAFE_TABLE := SYS.DBMS_ASSERT.ENQUOTE_NAME(P_TABLE, FALSE);
    SAFE_CONSTRAINT := SYS.DBMS_ASSERT.ENQUOTE_NAME(P_CONSTRAINT_NAME, FALSE);
    
    SQL_STMT := 'ALTER TABLE ' || P_SCHEMA || '.' || SAFE_TABLE
               || ' DISABLE CONSTRAINT ' || SAFE_CONSTRAINT;
    EXECUTE IMMEDIATE SQL_STMT;
END;

關鍵注意點

  • ENQUOTE_NAME(..., FALSE) 保持大小寫敏感,調用方必須傳入精確大小寫對象名
  • 所有動態 DDL 對象名拼接處**必須**經過 DBMS_ASSERT 處理
  • 代碼審計清單:搜尋 EXECUTE IMMEDIATE、DBMS_SQL.PARSE 等動態 SQL 入口
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved