在 Day 06 中,我們學習了最基礎的萬能密碼 admin' OR '1'='1。但在實際解題或資安實戰中,伺服器通常不會毫無防備地讓我們輸入 OR 或 UNION 等關鍵字。
今天我們要透過 PicoCTF 的 Irish-Name-Repo 2 實戰,紀錄當我們輸入教科書語法被黑名單攔截(顯示 SQLi detected.)時,如何透過「製造報錯」來推測後端資料庫架構,並精準構造繞過 Payload 拿到 Flag!
透過 PicoCTF 實戰,掌握以下核心技能:
SQLi detected. 攔截警告)。OR 關鍵字)的語法繞過技巧(Bypass)。SQLi detected.)嘗試在 Username 欄位輸入標準萬能密碼 admin' OR '1'='1 或 ORDER BY 1 時,畫面立刻顯示:
SQLi detected.

觀念拆解:
這代表後端程式碼使用了字串檢查(Blacklist Filter),只要偵測到OR、ORDER、UNION等關鍵字就會直接攔截。因此經典的' OR '1'='1在這裡失效了。
Error-Based)為了搞清楚後端的資料庫類型與語法結構,我們嘗試只輸入一個單引號:
Username: admin'
Password: 123
結果網頁並沒有跳出SQLi detected.,而是噴出了極具價值的 PHP / 資料庫警告訊息
Warning: SQLite3::query(): Unable to prepare statement: 1, near "123": syntax error in /var/www/html/login.php on line 38
Fatal error: Uncaught Error: Call to a member function fetchArray()...

1.資料庫類型: 後端使用的是 SQLite3(註解符號為 --)。
2.語法錯誤位置: 錯誤發生在near "123"(密碼欄位)。
3.後端 SQL 結構推測:
SELECT * FROM users WHERE name='$username' AND password=$password;
因為我們輸入的admin'帶有單引號,打破了原本的字串閉合結構,導致 SQL 解析到密碼123時產生語法錯誤!
既然確定了後端是SQLite3,且黑名單主要封鎖的是OR關鍵字,我們根本不需要使用OR!只要能讓資料庫確認 admin帳號存在,並把後續的密碼檢查註解掉即可。
Username: admin'--
Password: 隨便輸入(如123)
SELECT * FROM users WHERE name='admin'--' AND password=123;
admin':成功閉合帳號欄位。
--:在 SQLite 中代表註解符號,將後方的' AND password=123全部變為註解並忽略!
最終執行的 SQL 變成了純粹的 SELECT * FROM users WHERE name='admin'。
按下 Login 提交後,成功繞過密碼檢查並以管理員身分登入!
Flag: picoCTF{m0R3_SQL_plz_8c334129}