SQL Injection
📌 想像一個網站登入畫面,你輸入帳號密碼
正常情況下,網站會把你的輸入丟到資料庫檢查是否正確
如果網站沒做好防護,駭客可以在輸入框中「偷偷加上程式碼」
讓資料庫誤以為他就是管理員,甚至把整個資料庫都吐出來。
原理
- 應用程式將使用者輸入進 SQL 查詢字串
- 攻擊者插入惡意語法。
SELECT * FROM users WHERE username = '輸入值' AND password = '輸入值';
如果輸入' OR '1'='1
,整個條件永遠為真
攻擊者即可繞過驗證
攻擊方
📌 小偷:觀察 → 嘗試 → 偷取 → 掩蓋痕跡
目標
- 取得敏感資料(帳號、密碼、個資)
- 身份驗證繞過,取得系統控制權
- 破壞或修改資料,影響服務可用性
流程
-
偵察(Recon):找出可能受 SQL Injection 影響的頁面或 API(登入、搜尋、表單)
-
輸入測試(Fuzzing / Probe):嘗試
' OR '1'='1
或其他 payload,檢查錯誤訊息或異常回應
-
取得資料 / 提權:利用成功的 SQL Injection,抽取敏感欄位,或插入惡意指令提升權限
-
掩蓋痕跡:刪除日誌或修改錯誤訊息以隱藏行為。
工具
- SQLMap、Burp Suite、手動 payload 測試
- 利用錯誤訊息或堆疊回傳來判斷資料庫版本與欄位
- 利用 UNION、SELECT、INSERT、UPDATE 等 SQL 語法竊取資料
指標
- 不尋常的 SQL 錯誤訊息被回傳
- 多次相似查詢或特殊符號輸入(
'--
、UNION SELECT
)
- 異常資料庫流量或大量查詢
防禦方
📌 房主:鎖門 → 安裝警報 → 限制權限 → 定期巡邏
程式層
- 使用參數化查詢(Prepared Statements / ORM)
- 輸入驗證與型別檢查
- 不直接顯示資料庫錯誤訊息
資料庫層
- 最小權限帳號(僅能 SELECT / INSERT 必要欄位)
- 監控異常 SQL 查詢與大流量操作
網路/架構層
- WAF 阻擋已知 SQL Injection patterns
- 定期滲透測試與安全掃描
偵測
- 日誌分析:檢查關鍵字的輸入
- SIEM / IDS:設定異常資料庫流量告警
- 事件發生時:隔離受影響服務、比對並修補
結論
攻擊者透過在輸入欄位注入惡意 SQL 語句
防守角度來看,防禦核心在於程式層的安全設計
- 採用參數化查詢
- 嚴格輸入驗證
- 最小化資料庫帳號權限
- 搭配 WAF 與監控系統
📌 任何可輸入的接口都是潛在攻擊點