SQL,或稱為結構化查詢語言(Structured Query Language),是一個特定於資料庫管理系統(DBMS)的語言,主要用於管理和操作關聯式資料庫
資料庫是一個組織和儲存資料的集合,通過使用資料表的方式來以結構化形式呈現資料
這些資料表包含行 ( column ) 和列 (row) ,其中每一行代表一個特定的資料類型,也就是欄位,每一列則包含實際的資料
拿 Excel 來舉例,一份 Excel 檔案就是一個資料庫,工作表就是各個資料表 ( Table ),ABCD 是欄位 ( column ),就是像 id, password ...等等的資料類型, 123 是列 ( row ),代表每一筆資料
整體結構 :
資料庫名稱 > 資料表名稱 > 資料欄位名稱 > 資料
database > table > column > data
我們通常需要透過資料庫管理系統來進行資料庫操作
DBMS 是一種軟體工具或系統,用於管理資料庫的建立、設定、存取和維護,它提供了一個界面,使用戶可以使用 SQL 語言來與資料庫進行互動
一些常見的 DBMS 包括 MySQL、Oracle、Microsoft SQL Server 和 PostgreSQL
CRUD 代表四個基本的資料庫操作概念
假設我有一張表叫 users,它裡面有三個欄位分別是
Table : users
Column : username, password, email
如果我今天要找到名字為 admin 的人的資料,那我可以這樣打
SELECT * FROM users WHERE username = 'admin' ;
條件超過一個的話可以用 AND 或 OR 連結
攻擊者試圖通過將惡意 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 來檢索應用程式中隱藏的資料,這些資料通常是不對外顯示的,但攻擊者可以透過特定的 SQL 語句來讀取它們
假設有一個醫療記錄系統,其中某些患者的病歷是未公開的,但攻擊者試圖存取這些未公開的記錄
輸入:' OR patient_id = 'confidential_patient' --
查詢 :SELECT * FROM medical_records WHERE patient_id = '' OR patient_id = 'confidential_patient' --' AND sensitive_data = '...'
攻擊者試圖透過SQL注入影響應用程式的邏輯,執行未經授權的操作或繞過存取控制
攻擊者嘗試以非管理者身份登入並獲得管理權限
輸入:' OR '1'='1
查詢:SELECT * FROM users WHERE username = '' OR '1'='1' AND is_admin = 1
攻擊者試圖將額外的查詢結果與原始結果合併,以檢索額外的數據
攻擊者嘗試從另一個表格中檢索資料
輸入:' UNION SELECT credit_card_number, 'x' FROM credit_cards --
攻擊者使用SQL注入來探測資料庫結構和內容,例如表格名稱、欄位名稱和資料
攻擊者嘗試確定表格名稱
輸入:' AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables WHERE table_name = 'sensitive_table')) --
在SQL盲注入中,攻擊者無法直接看到查詢結果,但可以透過提交SQL語句來確認或否定條件的真假
攻擊者嘗試確認密碼的第一個字符是否為 'a'
輸入:' OR IF(SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a', 1, 0) = 1 --
https://tech-blog.cymetrics.io/posts/nick/sqli/
https://feifei.tw/sql-injection/#more-431