# 資安系列讀書會part 3筆記 時間:2023/10/20 講者:Maxx 簡報連結:https://docs.google.com/presentation/d/1Q70Hj9J3h27EyzaSX0Id1AfmHJCtWT7urvQfLV1EOn8/edit#slide=id.g290dad81b87_1_198 ## 什麼是資料庫 * 結構完整的資料 * 用數位的方式儲存 * 由資料庫管理系統管理 ## 資料庫的類型 * Relational(關聯式資料庫) * Object-oriented * NoSQL * Hierarchical * 還有更多.. (以下的範例會以relational為主) ## Relational database(關聯式資料庫) * 由多個表(table)組成 * 每個表裡面的資料都是有關連的 ![](https://hackmd.io/_uploads/B17fN1ezT.png) ## Tables(資料表) * 資料庫就是由多張資料表所組成 * 每張資料表必須有獨一無二的資料 (也就是其他地方不會有一樣的) * 每張資料表必須有primary key(主鍵) ## Structured Query Language (結構化查詢語言) * 結構化的 * 針對特定領域的語言 * 用來與資料庫溝通 * 使用時關鍵字必須都是大寫或都是小寫 #### CREATE ``` CREATE TABLE IF NOT EXISTS Players( id TEXT PRIMARY KEY, username TEXT UNIQUE NOT NULL, password NOT NULL, bio TEXT ) ``` 這裡表示創建一張表叫Players 表裡面會記錄每一筆資料的id(主鍵),username,password,bio #### READ ``` SELECT * FROM Players WHERE username = "admin" AND password ="v3ry_s4f3_p4s5w0rd"; ``` 這裡表示從Players這張表裡找出username是admin和password是v3ry_s4f3_p4s5w0rd的資料 #### UPDATE 1. ``` INSERT INTO Players (id, username, password, bio) VALUES ("plr_123", "NTNU_GDSC", "gdsC2023!" , "yes") ``` 這裡表示將("plr_123", "NTNU_GDSC", "gdsC2023!" , "yes")這筆資料加入Players這張表裡 2. ``` UPDATE Players SET password = "SaferPassword" WHERE username = "NTNU_GDSC"; ``` 這裡表示對Players這張表裡的username是NTNU_GDSC的那筆資料 將他的password改成SaferPassword #### DELETE ``` DELETE FROM Players WHERE username = "NTNU_GDSC"; ``` 這裡表示刪除Players這張表裡的username是NTNU_GDSC的資料 ## SQL Injection(SQL 注入式攻擊) * 利用開發人員在撰寫SQL時留下的漏洞 * 利用設定錯誤的資料庫 * 是一種非常常見的攻擊 通常會用來獲得一些個人資料、身分字號、信用卡卡號...等等 ## 我們該如何做到呢? 1. 尋找有漏洞的輸入 2. 開始寫可以利用這個漏洞的程式碼 3. 像電腦之神祈禱 4. 將程式碼傳到後端 5. 讓後端執行這個程式碼 ## SQL Injection的種類 * Blindfold 盲注攻擊 * 不斷的嘗試 * 低成功率 * 低成本 * Classic SQL Injection 經典的SQL注入攻擊 * 有目的的攻擊 * 高成功率 * 高成本 ## 作為攻擊者我們能得到什麼 * 獲取原本得不到的資料 * 取得資料庫 ## 我們該如何進行SQLi ### 範例1 假設正常情況下查詢登入資料的SQL語法會長這樣 (登入時帳號輸入 **admin** ,密碼輸入 **password** ) ``` SELECT * FROM Admins WHERE username = 'admin' AND password = 'password'; ``` 如果我們把密碼改成輸入 **password' OR 1=1;--** 就會變成這樣 ``` SELECT * FROM Admins WHERE username = 'admin' AND password = 'password' OR 1=1;--'; ``` --(兩個減號)是SQL語法中的註解 所以我們將搜尋的條件新增了 1=1,意思就是一定符合條件 這樣我們就可以成功登入了 ### 範例2 假設正常情況下更改使用者資料的SQL語法會長這樣 (輸入使用者的名稱 **Maxx** ) ``` UPDATE Players SET money = 100 WHERE username = 'Maxx'; ``` 如果我們把使用者名稱改成輸入 **Maxx'; DROP TABLE Players;--** 就會變成這樣 ``` UPDATE Players SET money = 100 WHERE username = 'Maxx'; DROP TABLE Players;--'; ``` 這樣在我們成功的修改使用者資料後, 也順便把整張資料表一起刪除了 --- 最後 有興趣的同學可以上[PicoCTF](https://picoctf.org/)這個網站挑戰其他題目喔