淺談 SQL injection攻擊

NEITHNET 情資分享

NEITHNET 資安實驗室

  SQL Injection 是一種 Web 安全漏洞,攻擊者利用未經驗證的使用者輸入,輸入任意資料或修改SQL指令對資料庫進行惡意攻擊,導致後端資料庫執行指令時,傳回非預期的結果(例:敏感資料)。

常見的SQL Injection攻擊方式

  Error based Injection

   攻擊者向資料庫發送一些惡意查詢,從而導致錯誤

   例如:
    1、使用註解行(–)使資料庫忽略有效查詢的一部分。
      Select * from users where username = ‘jack’ or 1=1– (此後的所有內容都將被忽略)

    2、在查詢中建立始終為TRUE的條件,例如 ‘1’ = ‘1’ ‘a’ = ‘a’ 等
      Select * from users where username=’jack’ or ‘a’=’a’ — and password=’pass’

  ● Union Based SQL injection:

   將多筆查詢的結果藉由UNION語法合併到單次查詢中,查詢原本不提供的資訊。

   例如:
    SELECT name, description FROM products WHERE category = ‘Gifts’
    攻擊者可以輸入:
    ’ UNION SELECT username, password FROM users–
    這會傳回所有使用者名稱和密碼以及產品的名稱和描述。

  ● Blind SQL injection:

   只有正確的查詢才會顯示結果,錯誤的查詢不會回傳任何內容。攻擊者應該嘗試產生邏輯上正確的查詢。Blind SQL injection有兩種類型是基於Boolean-based和Time-Based。

   □ Boolean-based Injection:

     是一種推理 SQL 注入技術,向資料庫發送 SQL 查詢,強制應用程式根據查詢傳回的是 TRUE 還是 FALSE 結果來傳回不同的結果。

   □ Time-Based Injection:

     攻擊者發送特定的 SQL 查詢,強制資料庫「睡眠」或暫停指定時間,利用 SQL Injection 造成查詢時的時間延遲,透過時間差來洩漏資料庫中的資料。

SQL Injection 範例

  登入畫面中,使用者名稱和密碼是使用者輸入資料的欄位。根據使用者的輸入,將建立查詢

  通常的查詢是

   Select * from USERS where username=’username’ and password=’password’.
   攻擊者可以在password欄位輸入 ‘ OR 1=1– ,就不需要使用密碼也能登入了
   查詢語句會變成:
   Select * from USERS where username=’admin’ and password=’’ OR 1=1–

解決方式:

  使用參數化查詢,原理是資料庫語法中的佔位符號,將佔位符號的功能弄成預處理的 SQL 語句,資料庫會先   將 SQL 語句進行編譯,之後再把使用者輸入的參數進行編譯後的 SQL 語句再執行。

  SELECT * FROM USERS WHERE username = $1 AND password = $2 這樣的參數不會被當作SQL語法去執行,因此就算使用者輸入的參數有不當的指令也不會執行成功。

常見SQL Injection攻擊流程

  1、綠色為正常web流程
  2、藍色字為不可更改,只能改橘色部分
  3、只要是文字都可以Injection,需要compiler的不容易Injection

防禦方式

  ● 參數化查詢:事先定義所有的SQL 代碼為不同的參數,並限制使用參數進行SQL 查詢
  ● 白名單輸入:只允許特定的數值輸入欄位
  ● 限制轉義參數:檢查使用者輸入的內容,將SQL 代碼替換成其他字元,強烈建議不要轉義所有使用者提供的輸入
  ● 最低權限原則:限制SQL 指令的範圍,降低SQL指令可執行的動作

參考來源:

  1.https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
  2.https://zh.wikipedia.org/zh-tw/SQL%E6%B3%A8%E5%85%A5
  3.https://www.greycampus.com/opencampus/ethical-hacking/types-of-sql-injection
  4.https://portswigger.net/web-security/sql-injection#how-to-prevent-sql-injection

  更多資安訊息及防護策略,歡迎與NEITHNET資安專家聯繫:info@neithnet.com