Skip to content

SQL injection

什麼是 SQL injection

SQL 注入(SQL Injection)是一種常見的網頁應用程式安全漏洞,它允許攻擊者將惡意的 SQL 程式碼插入到應用程式的資料庫查詢中,從而干擾資料庫的運作,獲取敏感資訊,甚至接管整個資料庫。

如何測試是否有 SQL injection 漏洞?

可以在任意有輸入匡的地方輸入 ' 或是 " 符號,粗淺的漏洞通常就會因此而出現 Error 出現。

輸入匡

成因與如何攻擊

SQL 注入通常發生在應用程式將使用者輸入直接拼接到 SQL 查詢字串中,而沒有進行適當的驗證和過濾。例如,一個有漏洞的登入頁面可能有如下的 SQL 查詢:

sql
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";

如果攻擊者在使用者名欄位輸入 ' OR 1=1--,而密碼欄位隨意輸入,那麼最終的查詢語句會變成:

sql
SELECT * FROM users WHERE username='' OR 1=1--' AND password='隨意輸入'

在 SQL 中,-- 表示註釋,所以 -- 後面的內容都會被資料庫忽略。因此,上述查詢實際上等同於:

sql
SELECT * FROM users WHERE username='' OR 1=1

這個查詢會返回 users 表中的所有使用者,因為 1=1 永遠為真。攻擊者就可以繞過登入驗證,未經授權地訪問到所有使用者的資料。

除了繞過認證,SQL 注入還可以用於:

  1. 查詢敏感資訊,如其他使用者的個人資料、密碼等。
  2. 修改資料庫內容,如更改密碼、刪除資料等。
  3. 執行資料庫管理操作,如關閉資料庫、授予權限等。
  4. 在某些情況下,還可以讀寫伺服器上的檔案,執行任意的系統命令。

如何防止 SQL Injection

為了防止 SQL 注入,應用程式開發者需要:

  1. 對所有的使用者輸入進行驗證和過濾,特別是那些被用於構建 SQL 查詢的部分。
  2. 使用參數化查詢或準備語句,將使用者輸入與 SQL 查詢邏輯分離。
  3. 限制資料庫使用者的權限,只授予必要的最小權限。
  4. 定期進行安全測試和程式碼審查,及時發現和修復 SQL 注入漏洞。

SQL 注入是一種古老但仍然普遍存在的安全問題,它曾導致許多高調的資料洩露事件。開發者需要提高安全意識,在開發過程中始終考慮 SQL 注入的風險,並遵循安全的編碼實踐,才能有效地保護應用程式和使用者的資料安全。