iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

什麼是 SQL (Structured Query Language) ?

SQL,或稱為結構化查詢語言(Structured Query Language),是一個特定於資料庫管理系統(DBMS)的語言,主要用於管理和操作關聯式資料庫

資料庫 Database

資料庫是一個組織和儲存資料的集合,通過使用資料表的方式來以結構化形式呈現資料

這些資料表包含行 ( column ) 和列 (row) ,其中每一行代表一個特定的資料類型,也就是欄位,每一列則包含實際的資料

拿 Excel 來舉例,一份 Excel 檔案就是一個資料庫,工作表就是各個資料表 ( Table ),ABCD 是欄位 ( column ),就是像 id, password ...等等的資料類型, 123 是列 ( row ),代表每一筆資料

https://ithelp.ithome.com.tw/upload/images/20231011/20162775InBO7NplcE.png

整體結構 :

資料庫名稱 > 資料表名稱 > 資料欄位名稱 > 資料
database > table > column > data

我們通常需要透過資料庫管理系統來進行資料庫操作

DBMS

DBMS 是一種軟體工具或系統,用於管理資料庫的建立、設定、存取和維護,它提供了一個界面,使用戶可以使用 SQL 語言來與資料庫進行互動

https://ithelp.ithome.com.tw/upload/images/20231011/20162775pqUmL9H1RK.png

一些常見的 DBMS 包括 MySQL、Oracle、Microsoft SQL Server 和 PostgreSQL

CRUD

CRUD 代表四個基本的資料庫操作概念

  • 建立 Create
  • 讀取 Read
  • 更新 Update
  • 刪除 Delete

簡單的 SQL 範例

假設我有一張表叫 users,它裡面有三個欄位分別是

Table : users

Column : username, password, email

如果我今天要找到名字為 admin 的人的資料,那我可以這樣打

SELECT * FROM users WHERE username = 'admin' ;

https://ithelp.ithome.com.tw/upload/images/20231011/20162775hzSqoAjjT8.png

條件超過一個的話可以用 AND 或 OR 連結

SQL Injection

攻擊者試圖通過將惡意 SQL 語句插入到應用程式的資料輸入欄位,來操控或存取資料庫,這種攻擊可以對應用程式造成嚴重的損害,包括資料外洩、損壞,以及用戶隱私受到侵犯

舉例

假設今天有一個登入介面他背後 SQL 的查詢語法寫這樣

SELECT * FROM users WHERE username = '使用者輸入' AND password = '使用者輸入'

看起來很正常對不對 ! 那如果今天使用者的輸入是 ' OR 1=1-- 呢 ?

這如果直接帶入會變成

SELECT * FROM users WHERE username = '' OR 1=1--' AND password = '使用者輸入'

-- 在SQL當中會代表註解的意思

OR 只要有一邊的條件滿足就能執行,既然 1=1 這個條件已經滿足了,這是不是代表我不需要知道帳號密碼,這條 SQL 就會把所有資料都顯示出來,這就是 SQL Injection

常見註解

資料庫軟體 註解方式
Oracle --comment
Microsoft --comment /*comment*/
PostgreSQL --comment /*comment*/
MySQL -- comment /*comment*/ #comment

常見的 SQL Injection 分類

Retrieving hidden data - 獲得隱藏的資料

攻擊者可能試圖透過 SQL Injection 來檢索應用程式中隱藏的資料,這些資料通常是不對外顯示的,但攻擊者可以透過特定的 SQL 語句來讀取它們

舉例

假設有一個醫療記錄系統,其中某些患者的病歷是未公開的,但攻擊者試圖存取這些未公開的記錄

輸入:' OR patient_id = 'confidential_patient' --
查詢 :SELECT * FROM medical_records WHERE patient_id = '' OR patient_id = 'confidential_patient' --' AND sensitive_data = '...'

Subverting application logic - 影響應用程式邏輯

攻擊者試圖透過SQL注入影響應用程式的邏輯,執行未經授權的操作或繞過存取控制

舉例

攻擊者嘗試以非管理者身份登入並獲得管理權限

輸入:' OR '1'='1
查詢:SELECT * FROM users WHERE username = '' OR '1'='1' AND is_admin = 1

UNION attack - UNION 攻擊

攻擊者試圖將額外的查詢結果與原始結果合併,以檢索額外的數據

舉例

攻擊者嘗試從另一個表格中檢索資料

輸入:' UNION SELECT credit_card_number, 'x' FROM credit_cards --

Examining the database - 測試資料庫

攻擊者使用SQL注入來探測資料庫結構和內容,例如表格名稱、欄位名稱和資料

舉例

攻擊者嘗試確定表格名稱

輸入:' AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables WHERE table_name = 'sensitive_table')) --

Blind SQL injection - SQL 盲注入

在SQL盲注入中,攻擊者無法直接看到查詢結果,但可以透過提交SQL語句來確認或否定條件的真假

舉例

攻擊者嘗試確認密碼的第一個字符是否為 'a'

輸入:' OR IF(SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a', 1, 0) = 1 --

如何防範

  • 使用參數化查詢 : 確保用戶輸入不會被解釋為 SQL 代碼,而是作為參數進行處理
  • 權限管理 : 確保每個用戶只能訪問他們應有的資料,適當設置資料庫和應用程式的權限
  • 輸入驗證 : 確保用戶輸入的資料是有效且安全的,防止攻擊者通過輸入欄位插入惡意內容
  • 使用輸出編碼 : 將輸出的資料進行編碼,以防止攻擊者通過輸出來注入惡意代碼

參考資料

https://tech-blog.cymetrics.io/posts/nick/sqli/
https://feifei.tw/sql-injection/#more-431


上一篇
Day 25 Command Injection (二)
下一篇
Day 27 SQL Injection (二)
系列文
學分的追逐,資安的啟程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言