iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Security

資安新手的試煉之路系列 第 14

資安新手的試煉之路 Day 14

  • 分享至 

  • xImage
  •  

今天我們來簡單介紹一下SQLi

SQL 注入攻擊(SQL Injection,SQLi)

簡介

SQL 注入(SQL Injection, SQLi)是一種嚴重的網絡攻擊技術,攻擊者通過在應用程式的輸入字段中插入惡意 SQL 語句來操縱數據庫執行未經授權的操作。這種攻擊方式可導致敏感數據的洩露、數據庫的篡改甚至控制整個伺服器。

SQLi 是最早且仍然非常常見的 Web 安全漏洞之一。攻擊者利用應用程式對 SQL 查詢處理不當的特性,修改查詢結果或執行其他惡意查詢。

攻擊機制

SQL 注入攻擊的核心在於,應用程式沒有對用戶輸入進行充分的驗證和過濾,直接將未經處理的輸入嵌入到 SQL 查詢中,從而允許攻擊者注入額外的 SQL 代碼並執行未預期的操作。

示例
假設有以下查詢,用於從資料庫驗證用戶名和密碼:

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

如果攻擊者輸入如下內容作為用戶名和密碼:

  • 用戶名:' OR '1'='1
  • 密碼:' OR '1'='1

這樣構造的查詢會變成:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'

這樣一來,條件總是成立,攻擊者便可繞過身份驗證,成功登入系統。

SQL 注入的類型

  1. 聯合查詢注入(Union-based SQLi)
    攻擊者使用 UNION 操作符將惡意的查詢與原查詢結合,從而檢索其他數據表的內容。這種方式常用於竊取敏感信息(如用戶名、密碼等)。

  2. 基於錯誤的 SQL 注入(Error-based SQLi)
    通過構造錯誤查詢,使得應用程式返回具體的 SQL 錯誤信息,攻擊者可以利用這些錯誤信息來獲取資料庫結構和表格詳細信息。

  3. 盲注(Blind SQL Injection)
    當應用程式不會直接返回 SQL 錯誤信息時,攻擊者使用盲注技術來推測資料庫的內容。這種方式需要多次查詢並通過觀察應用程式的行為或回應來獲取數據。

    • 基於布爾型的盲注(Boolean-based blind SQLi):攻擊者向伺服器發送不同的 SQL 條件,並觀察返回的頁面內容是否改變。
    • 基於時間延遲的盲注(Time-based blind SQLi):通過 SQL 中的延遲函數(如 SLEEP()),攻擊者可以根據伺服器回應的時間來推測資料庫結果。

SQLi 的風險

SQL 注入可以對應用程式和伺服器帶來嚴重的安全風險:

  • 數據洩露:攻擊者可以訪問未經授權的資料,從而竊取用戶敏感信息,如用戶名、密碼、電子郵件等。
  • 數據篡改:攻擊者可能通過注入惡意 SQL 語句來修改、刪除或插入數據。
  • 伺服器控制權:在某些情況下,攻擊者甚至可以利用 SQLi 漏洞執行系統命令,取得對伺服器的完全控制。
  • 拒絕服務(DoS):惡意的 SQL 語句可能會導致資料庫過載,從而使應用程式無法正常工作。

防禦措施

  1. 使用準備好的語句(Prepared Statements)和參數化查詢
    準備好的語句允許開發者將 SQL 查詢與數據分離,從而有效防止 SQL 注入。

    安全範例(使用 PDO)

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
    $stmt->execute(['username' => $username, 'password' => $password]);
    
  2. 輸入過濾和驗證
    所有來自用戶的輸入都應該進行過濾和驗證。不要信任任何來自外部的輸入數據。可以使用正則表達式來限制輸入格式,特別是在查詢中涉及數字或特定格式的數據時。

  3. 最小權限原則
    確保應用程式使用的資料庫帳號只具備最低限度的權限。限制資料庫用戶僅能執行必要的查詢,避免擁有 DROP 或 DELETE 等高級權限。

  4. 錯誤處理
    不應將詳細的 SQL 錯誤信息直接暴露給用戶。相反,應該將錯誤日誌記錄在伺服器上,並向用戶顯示友好的錯誤信息,以避免洩露應用程式的內部結構。

  5. 使用 Web 應用防火牆(WAF)
    WAF 可以實時監控並攔截潛在的 SQL 注入攻擊,這是一種額外的安全層,特別是在應用程式或伺服器無法立即修補時。

結論

SQL 注入攻擊是一種破壞性極強的攻擊方式,但也相對容易防禦。通過遵循安全編碼的最佳實踐,如使用準備好的語句、嚴格驗證輸入和限制資料庫權限,可以大大降低 SQLi 攻擊的風險。安全防護不僅應該在開發過程中進行,還需要隨著應用程式的維護和更新進行不斷的檢測和加強。


上一篇
資安新手的試煉之路 Day 13
下一篇
資安新手的試煉之路 Day 15
系列文
資安新手的試煉之路29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言