SQL injection
1. 發現點
🔎 搜尋框 (Search Box)
🔗 URL 參數(例子:
example.com/page.php?id=1
)📩 表單提交 (POST 請求)
📑 Cookie、HTTP header(有時 header injection 都有驚喜)
🛠️ URL fragment(有時候甚至在 hash URL# 後面都可能有 bug)
2. 測試Payload
判斷 Error-based or Blind
Error-based:輸入
'
有 SQL 錯誤回報Blind:冇錯誤回報,只係結果唔同
Time-based Blind SQLi 可以用:
睇下反應慢唔慢。
3. 繞過身份驗證
✅ 1️⃣ 經典 SQLi 認證繞過攻擊流程:
登入時輸入:
username:
' OR '1'='1
password:(隨便或空白)
執行 SQL:
OR '1'='1'
會令條件永遠為真 → 成功登入。
✅ 2️⃣ Intruder 自動化爆破建議(Burp)
在 Burp 打開 Intruder
設定 Target (指向登入請求)
選擇 Payload Position (選 username/password)
開始 Attack,觀察回應(HTTP 狀態碼、回應長度或回應字串)
如果登入成功,回應可能變長或出現 dashboard 頁面字眼。
✅ 3️⃣ Raw MD5 / SHA1 特別繞過
PHP 如果用:
md5($password, true)
會傳回 16 位元 raw binary(有機會產生 null byte 或特殊字元)如果可以控制
$password
,攻擊者嘗試輸入:一些 payload 令 binary 結果中出現
'\
或\x00
,然後 SQL 語句就會被截斷或繞過。
進階 payload 思路(示範):
找 collision (複雜)
更常見係其他注入路徑(因為 binary injection 比較困難,但存在)
如果系統最後
base64_encode()
先傳入 SQL,攻擊者可以 base64 injection。
4. Union Injection 聯合注射
✅ 1️⃣ 使用 ORDER BY
測試欄位數量
ORDER BY
測試欄位數量目的:知道 SQL 查詢返回有幾多個欄位
操作方法:
先嘗試:
如果頁面正常,繼續:
當你試到
order by X
個欄位會報錯,就代表 總欄位數 = X - 1
例子:
order by 4
出錯,代表有 3 個欄位。
✅ 2️⃣ 使用 UNION SELECT
測試
UNION SELECT
測試目的:找出有幾個欄位可以成功回傳、顯示出你輸入的 payload
操作方法:
根據上面
ORDER BY
找到的欄位數,試:(如果係 3 個欄位)
如果成功,頁面會顯示數字
1
、2
、3
喺輸出位置。如果失敗,就繼續嘗試 4 個欄位:
知道有幾多個欄位同埋係邊個位置會顯示內容後,就可以用
@@version
、database()
或user()
代替其中一個位置嚟爆資料:
✅ 3️⃣ 使用 爆資料 測試
1. 輸出系統信息:
2.知道可以讀資料後,開始讀 database name:
2.然後列出所有 table:
2.再列欄位:
3.最後拉出敏感資料:
5. Time-based Blind SQLi
1. 發現盲注漏洞
1️⃣ 找輸入點(通常係登入表單、搜尋框、GET / POST 參數)。 2️⃣ 測試:
👉 如果 response 慢 3 秒或以上,就確認係 Time-based Blind SQLi。
2. 確認注入上下文
試下:
同
👉 比較回應時間,慢就代表成功。
3. 確定可以利用的 payload 模式
基本範例:
👉 用來猜第一個字元係唔係 'a' (ASCII 97)。
4. 編寫爆破邏輯(或者用 script)
1️⃣ 字符位置用 SUBSTRING()
2️⃣ 字元 ASCII 值用 ASCII()
3️⃣ 比較結果時觸發 SLEEP(3)
範例:
呢條語句係爆
table_name
嘅第一個字元係咪t
(ASCII 116)
5. 開始爆破順序
1️⃣ 先爆出 database() 2️⃣ 爆出 所有表名 (information_schema.tables) 3️⃣ 根據表名,爆出 所有欄位名 (information_schema.columns) 4️⃣ 最後用 LIMIT 一個一個爆資料內容。
6. 參考常用 SQLi 爆破模板
爆 database 名
SELECT database()
爆當前 user
SELECT user()
爆所有 table
SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()
爆欄位名
SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'
爆帳號密碼
SELECT concat(username,0x3a,password) FROM users
【第七步】避免出錯小提醒
-- -
後面有空格判斷
LIMIT
記得慢慢試 0,1 / 1,1 / 2,1response time 超過 3 秒就代表成功
太慢可以用二分法爆破 (binary search),但初期練習建議 ASCII 順序試。
6.Skills Assessment
最后更新于
这有帮助吗?