---
# System prepended metadata

title: 資安系列讀書會part 3筆記

---

# 資安系列讀書會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/)這個網站挑戰其他題目喔






