# 資安系列讀書會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)組成
* 每個表裡面的資料都是有關連的

## 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/)這個網站挑戰其他題目喔