💡 什麼是 SQL 注入攻擊(SQLi)?
在完成了前期的資訊收集與漏洞掃描後,今天我們正式邁入第三階段:OWASP Top 10 核心漏洞剖析!
SQL 注入攻擊(SQL Injection, SQLi) 算得上是 Web 資安史上最經典、破壞力也最強大的漏洞之一。當 Web 應用程式在處理使用者輸入的資料時,未進行適當的過濾或轉義,就直接將輸入字串「拼接」進 SQL 查詢指令中,攻擊者就能藉由注入惡意的 SQL 語法,改變原本 SQL 指令的執行邏輯。
成功利用 SQLi 漏洞,攻擊者可以:
繞過身份驗證(不需密碼直接登入)
讀取資料庫中的敏感資料(帳號、密碼hash、信用卡號)
修改或刪除資料庫資料
甚至在特定條件下取得伺服器的作業系統控制權(RCE)
🔍 SQL 注入的核心原理:字串拼接的災難
假設網站後台有一個登入驗證的 SQL 查詢如下:
SQL
SELECT * FROM users WHERE username = 'USER_INPUT' AND password = 'USER_INPUT';
若網頁對 username 沒有做任何過濾,攻擊者在帳號欄位輸入:
Plaintext
admin' OR '1'='1
最終拼湊出來的 SQL 語法就會變成:
SQL
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...';
因為 '1'='1' 永遠為真(True),使得整個 WHERE 判斷條件恆成立,伺服器就會誤以為驗證成功,直接發放 admin 的管理員權限!
🛠️ 手動測試 SQLi 的基本步驟
在自動化工具登場前,手動測試能幫助我們理解漏洞的本質:
http://target.com/page.php?id=1'
觀察回應: 若頁面跳出 SQL syntax error、Unclosed quotation mark 或頁面直接崩潰(500 錯誤),代表該輸入點很有可能存在 SQL 注入漏洞!
http://target.com/page.php?id=1 ORDER BY 1-- -(正常)
http://target.com/page.php?id=1 ORDER BY 5-- -(若報錯,代表欄位數小於 5)
💡 註解符號小知識: SQL 中的 -- - 或 # 用於將後方的原始 SQL 指令註解掉,避免語法報錯。
Plaintext
http://target.com/page.php?id=-1 UNION SELECT 1, version(), database()-- -
將原本 id 設為不存在的 -1,讓頁面優先顯示 UNION 後方我們想發動查詢的結果(例如資料庫版本與資料庫名稱)。