在前面的章節中,我們看過了前端 JavaScript 驗證與 Cookie 偽造。但當網站開發者把驗證邏輯移到後端、並使用資料庫(Database)來儲存帳號密碼時,是不是就絕對安全了呢?
答案是:不一定! 如果後端程式碼在處理資料庫查詢時,沒有將使用者輸入的資料進行「過濾」或「參數化處理」,攻擊者就能透過注入精心設計的 SQL 語法,閉合原有的查詢並插入自己的指令。今天我們就來聊聊 Web 資安領域最著名的漏洞——SQL Injection(SQLi)!
透過 PicoCTF 實戰,掌握以下核心技能:
' OR '1'='1)並繞過身份驗證(Authentication Bypass)。假設後端伺服器在處理使用者登入時,寫了類似下面的 SQL 查詢:
SELECT * FROM users WHERE username = '$user_input' AND password = '$pass_input';
如果開發者直接把使用者輸入的變數$user_input串接到 SQL 語句中:
正常情況: 我們輸入admin,SQL 會變成WHERE username = 'admin'。
攻擊情況: 我們在帳號欄位輸入 'OR '1'='1。
拼接後的 SQL 語句會變成:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...';
發生了什麼事?
單引號'成功閉合了原本的字串,而OR '1'='1'永遠為真(True)!這導致整條 WHERE條件直接成立,伺服器便會認定驗證通過,甚至直接回傳資料庫中的第一個使用者(通常就是admin)!
admin / admin),跳出登入失敗。'。若網頁跳出 SQL 語法錯誤(SQL Syntax Error)或行為異常,代表輸入的單引號成功干擾了後端的 SQL 語句構造。
admin' OR '1'='1

成功繞過驗證!網頁識別我們為管理員,並直接顯示包含了 Flag 的歡迎訊息:
Flag: picoCTF{s0m3_SQL_85832275}