CTF
Web
WWW
by watermelon
who am i?
西瓜
- 建電副社+學術
- 揪寒訓
- APCS忘記帶身分證的傻逼
- I人 不敢跟你打招呼一定是因為我社恐
- 什麼都學 啥都學不好
- 夜貓子
- :suicide:
- 貓戰/LOL 玩家

推個研究大攝影
Index
intro
仙貝芝士
漏洞
這頁真是做的可有可無
這句也是
這句也是
這句也是
這句也是
這句也是
這句也是
工具
intro
{Web}
-
Web:網站
-
尋找+利用網頁有的漏度(vulnerablility)
-
-
常用技術
-
command/code injection(指令注入)
-
SQL injection
-
XSS(Cross-site scripting)
-
- 好康的
- Bug bounty program(漏洞賞金)
- pen testing(滲透測試)
- 增進自己網頁開發技術
{Web}
-
經常用到的能力
python-
前端三劍客 三本柱
- html、CSS、Js
- F12(開發人員工具)
- 網路概論(小黑簡報)
- 對常見漏洞的認識
- linux
- (database)資料庫
- 顯然電腦要有網路
{仙貝先備知識}
{前後端}
-
前端:
- 直接面對+處理使用者的操作
- 把資料傳到後端
- 接收後端的回應&處理
- 純前端的網頁可以github page免費託管
-
後端:
- 處理前端傳來的使用者行為 與資料庫等服務交互
-
在某些情況下可以不用存在:靜態網站
- 內容固定 無伺服器端資料存取
- 用外部api代替
- 伺服器長期保持運作以回應使用者請求(自架 or 雲端託管)

{前端}
-
大多由html css js組成

{Html}
-
超文本標記語言(HyperText Markup Language)不是程式語言
- 檔案名後綴:.html .htm(為什麼有兩種副檔名)
-
常被比喻成網站的「骨架」,構成網頁的各個組件
-
每個部件都是一個標籤 以尖括號表示 結尾符號會加上"/"
-
例: <p>ian is dian</p>
-

{Html}
-
超文本標記語言(HyperText Markup Language)不是程式語言
- 檔案名後綴:.html .htm(為什麼有兩種副檔名)
-
前端網站必備
-
還可以加上屬性"attribute"

{CSS}
-
階層樣式表 (Cascading Stylesheets)不是程式語言
- 檔案明後綴:.css
-
常被比喻為網站的「外表」:控制字體 顏色 大小 動畫 佈局
-
無法獨自使用 必需配合html/xml(標記語言們)
-
可以放在html裡面或者獨立成.css
-
其實可以不要存在 但網站變超醜

有CSS

沒CSS
{Js}
-
爪哇劇本(JavaScript) ∈程式語言 - 檔案明後綴:.js
-
跟java沒半沒半毛錢關係 單純跟風
-
可以被比喻為人的神經和肌肉:處理互動和行為邏輯
-
語法簡單 快 相容性佳 但安全性較低(你看人家rust)
-
可以沒有 例如一些簡單的blog就不需要js

-
至於這些東東各自要怎麼寫&語法
-
所以你該去上每週五的網頁小社
-
用之前學其他程式語言的邏輯寫看看
-
不會再google/gpt搞懂就好
-
- 把台上講師問倒
-
-
太雜了 沒得一個一個教
{後端}
-
有許多不同的語言支持開發 僅做簡單介紹
-
PHP (ex:fb wordpress)
- 使用者多 相當常見
- 簡單 但常有人批評語法太古老
-
Java(ex:Linkedin、Amazon)
- 應用多 跨平臺兼容性高
-
Ruby(ex:twitter(誰要叫他x))
- 開發快 但難寫(詳見去年寒訓睡死的rubyonrails)
-
PHP (ex:fb wordpress)
{後端}
-
有許多不同的語言支持開發 僅做簡單介紹
-
Python (ex: reddit Ig)
- 好學 簡單 擴充多
-
Javascript(node.js) (ex:Yahoo)
- 前後端都用一樣 方便
-
Go (ex:google yahoo)
- Google在推自己家的語言
- 編譯快 保密性高 跨平臺
- 語法太簡單功能少 標準庫功能少
- 垃圾處理系統
- 錯誤(例外)處理差
-
Python (ex: reddit Ig)
{資料庫}
-
伺服器儲存資料的地方
-
關聯式資料庫:
- 以表格形式儲存:需預先定義結構(資料種類、項目名稱)
- 以SQL作為查詢
-
非關聯式資料庫:
- 每種的格式不太一樣 用的語言也不太一樣

-- SQL關鍵字多用大寫
-- 回傳指定範圍
SELECT 欄位名稱 FROM 表格名稱
-- 舉例:從database中回傳所有欄位(列出表格內容)
SELECT * FROM database
-- 加上判斷條件
SELECT 欄位名稱 FROM 表格名稱 WHERE 條件
-- 舉例:從User資料庫回傳年齡 > 25 的 姓名、年齡
SELECT 姓名, 年齡 FROM Users WHERE 年齡 > 25;
/* 相等在SQL中是"=" 不是 "==" */
{HTTP://}
複習一下小黑講的網路概論吧
{http request}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
\r\n: CR LF換行
{Method}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
動作 告訴伺服器你要幹嘛
{Method}
動作 告訴伺服器你要幹嘛(all methods)
-
最常見的:get/post
-
GET:
- 請求server顯示資料
-
參數(傳遞資訊的值)傳遞:
<網址>?<參數名1>=<值1>&<參數名2>=<值2>......
-
參數可以沒有+直接顯示在網址上
-
方便使用
-
安全性低:只能讀取
-
開網址也算是get
-
-
{Method}
動作 告訴伺服器你要幹嘛(all methods)
-
最常見的:get/post
-
POST:
- 將資料上傳到server 請求處理
-
參數傳遞:包含在本文內
-
相對安全
-
經常用來上傳表單 檔案等等
-
{Path}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
指在server端的路徑
路徑+get的parameter
如例: https://example.com/login?redirect=%2f
{Potocol ver.}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
協議的版本(HTTP/3是udp)

{Header}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
要告訴伺服器附加資訊
{Body}
POST /login?redirect=%2f HTTP/1.1\r\n
Host: example.com\r\n
Referer: http://example.com/index\r\n
User-Agent: Mozilla/5.0 ......\r\n
Content-Length: 32\r\n
\r\n
username=melon&password=p455w0rd
get類型的method沒有
{Response}
-
跟request格式整體差不多
-
HTTP/l.1 302 Found Content—Length: 35\r\n Content—Type: text/html; charset=UTF—8\r\n Location: https://examp1e.com\r\n Server: Apache/2.4.41 (Ubuntu)\r\n \r\n Redirecting to <a href:“/”>/</a>....
{Response}
-
跟request格式整體差不多
-
HTTP/l.1 302 Found Content—Length: 35\r\n Content—Type: text/html; charset=UTF—8\r\n Location: https://examp1e.com\r\n Server: Apache/2.4.41 (Ubuntu)\r\n \r\n Redirecting to <a href:“/”>/</a>....
Status Code
{Status Code}
-
表達回覆的狀態
-
1XX:資訊回應 「請求正在進行,修但幾累」
- 100:「這菜可以點嗎?」「OK,可以繼續點」(同意繼續傳輸)
- 101:「改用電話聊嗎?」 「好阿好阿」(同意更改協定)
- 102:「好了沒?」 「修但幾累」(處理中)
- 2XX:成功 (200:OK)
-
3XX:重新導向(redirect)「轉移到其他地方」
- 301:「搬家了 去新的地址找找」(永久遷移)
- 302:「在裝潢 去旅館找找」(暫時遷移:可能網站維護裝)
{Status Code}
-
表達回覆的狀態
-
1XX:資訊回應 「請求正在進行,修但幾累」
- 100:Continue
- 101:Switching Protocols
- 102:Processing
- 2XX:成功 (200:OK)
-
3XX:重新導向(redirect)「轉移到其他地方」
- 301:Moved Permanently
- 302:Found
{Status Code}
{Status Code}
-
表達回覆的狀態
-
4XX:客戶端錯誤 「你的問題」
- 400:Bad Request
- 403:Forbidden
- 404:Not Found💀
-
5XX:伺服器錯誤
- 500:Internal Server Error
- 502:Bad Gateway
- 503:Service Unavailable
- 504:Gateway Timeout
{Status Code}
-
表達回覆的狀態
-
4XX:客戶端錯誤 「你的問題」
- 400:Bad Request
- 403:Forbidden
- 404:Not Found💀
-
5XX:伺服器錯誤
- 500:Internal Server Error
- 502:Bad Gateway
- 503:Service Unavailable
- 504:Gateway Timeout
{Cookie}
-
小餅乾紀錄使用者資訊 - 跟網域和路徑綁定(只在指定網域範圍內有效)

{Cookie}
-
小餅乾的一些屬性 -
HttpOnly:
- 不能用Js獲得
-
Secure:
- 只在"Https"下會傳輸
-
Expires=<date>:
- 在<date>後失效
- 沒設定:關閉網頁後失效
-
Max-Age=<seconds>:
- 優先級彼Expire高
{Session}
-
Cookie的問題:
- Cookie可以被Client修改(安全問題)
- Cookie太多=>影響傳輸效率
存一些在Server side
可辨認Cookie有沒有被修改過
{Session}

沒有Session id

很久沒登入/沒登入過
{Session}

創建+回傳Session id

很久沒登入/沒登入過
Session id
ID
{Session}

Session id 包含在cookie中

很久沒登入/沒登入過
Session id
ID
Session id
{Session}
很久沒登入/沒登入過
ID

: Session_id=ckefgisc

比較
{cookie,session_id}
{Session}
很久沒登入/沒登入過
ID

: Session_id=ckefgisc

比較
{cookie,session_id}
正確
👍
{Session}
很久沒登入/沒登入過
ID

: Session_id=ckefgisc

比較
{cookie,session_id}
正確
👍
錯誤
{Tools}
-
Developer Tools(開發者工具)
- 開啟方式:
- F12(什麼廢話)
shift + ctrl + I
- 右鍵目標元素 + 檢查
- 可以直接看到網頁元素的html

連結:V宅注意!!
{F12}
-
常用功能
- elements:
- 該網頁html
- console:
- 即時運算 直接打
js就可以運行
- 即時運算 直接打
- Sources:
- 檔案架構
- Network
- Application

{F12}
-
常用功能
- Network
- 怎麼啥都沒有?
- 要開啟這個頁面
才會開始紀錄
- Application

{F12}
-
常用功能
-
Network
-
怎麼啥都沒有?
-
要開啟這個頁面
才會開始紀錄 -
=>refres
-
-
Application

{F12}
-
常用功能
-
Application
-
記錄和管理網站需要的資源和數據

瀏覽器永久存儲
Session
資料庫
cookie
暫存
{curl}
-
透過 HTTP Protocol上傳/下載檔案的指令
curl 'https://example.com'
-i/--include # 顯示 response header
-v/--verbose # 詳細資料
-d/--data 'key=value&a=b' # HTTP POST
-X/--request 'PATCH' # Request method
-H/--header 'Host: fb.com' # 設定 header
-b/--cookie 'user=guest;' # 設定 cookie
-o/--output 'output.html' # 下載(引號內為自訂檔名)
-O # 不需要設定檔名的下載
-C # 被打斷後繼續下載
-L # 會跟著301 302跳轉
{Burp Suite}
-
Web滲透測試工具
- 有gui kali內建


{DVWA}
-
Damn Vulnerable Web Application
有缺陷的網頁應用 -
測試/學習常見的漏洞

{漏洞介紹}
{List}
-
Path traversal/LFI
-
XSS(cross site scripting)
-
SQL Injection
-
CLRF
-
CRSF
-
Command Injection
{Path taversal}
-
路徑:
-
絕對路徑:不因當前所在資料夾改變而改變
- 某台server下的html檔案:https://watermelon-1234.github.io/memorize_voc/index.html
- 我電腦C槽的steam啟動檔案:C:\Program Files (x86)\Steam\steam.exe
-
相對路徑:以當前位置比較出來的路徑
- .目前的目錄
- /根目錄
- ..上一層目錄
- ./index.html 在同一層目錄的index.html = index.html
- ../img/melon.png 在上層目錄中的img目錄的melon.png
-
絕對路徑:不因當前所在資料夾改變而改變
{Path taversal}
-
if有一個連結為:example.com/?file=index.html
-
功能:顯示伺服器中的<file>檔案
-
How could i find other sceret file in this server?
{Path taversal}
-
if有一個連結為:example.com/?file=index.html
-
用相對路徑取得其他檔案
- file=../../../etc/passwd
-
CRACKED!
{Path taversal}
-
if有一個連結為:example.com/?file=index.html
-
用相對路徑取得其他檔案
- file=../../../etc/passwd
-
<?php
$page = $_GET['page']; // index.php
include("/var/www/html/" . $page);
?>
<?php
$page = $_GET['page']; // ../../../../../../../etc/passwd
include("/var/www/html/" . $page); /var/www/html/../../../../../../../etc/passwd
?>
{Path taversal}
-
How to prevent?
-
主動檢查路徑
- 把輸入轉成絕對路徑 用startwith()類的方法檢查
-
禁止危險符號
- ../ 上一層、/開頭 根目錄、:windows磁碟、% url編碼 等等
- 建允許訪問的白名單 只有輸入在白名單才放行
- 用寫好的函式庫(ex : Flask,Django)
- 最小權限:降低網頁應用的權限 根本無法訪問機密檔案
- 設定 Web Server 的安全配置:Njinx,Apache 等等
-
主動檢查路徑
{XSS}
-
網站會動:
-
client端讓有害的js運行=>js權限高=>搞事囉
-
- 讓其他使用者執行某些js code
- 種類
- Reflected XSS (反射式 XSS)
- Stored XSS (儲存型 XSS)
- DOM XSS (DOM跨站腳本攻擊)
{XSS}
-
Reflectd XSS
- 透過 URL 參數提供 XSS 攻擊:(ex:開啟不明連結)
- 完整html 自己載來玩(你可以用curl) 架github會被擋(github自己有安全保護機制)
- server直接用GET 傳來的參數嵌入前端
- skill:用urlencode jscode等編碼混淆
<script>
// 獲取 URL 中的 'message' 參數
const urlParams = new URLSearchParams(window.location.search);
const message = urlParams.get('message');
// 直接將 message 插入到 DOM 中
document.getElementById('message').innerHTML = message;
</script>
{XSS}
-
Reflectd XSS
- parameter(參數)設成:
message=<script>alert(1);</script>
- 載入message時便會執行alert(1);
- 可以在"<script>" 和 "</script>"之間塞js程式碼


GET + XSS payload
{XSS}
-
Reflectd XSS
- parameter(參數)設成:
message=<script>alert(1);</script>
- 載入message時便會執行alert(1);
- 可以在"<script>" 和 "</script>"之間塞js程式碼


GET + XSS payload
respond with XSS payload

{XSS}
-
Stored XSS
- 保存在伺服器資料庫中的 JavaScript 代碼
- 網站本身提供的注入漏洞
- 例如:在網站評論區塞XSS payload(payload:有效負載 類似之於data的matadata)
- 每個開啟評論區的人都會執行你塞的payload

{XSS}
-
DOM XSS
- DOM:文件物件模型(想成某種物件)
- 利用網頁動態顯示注入payload
- 完全不經過server
// 把hash部分(不是 GET respond:不經過server) 插入頁面
var search = window.location.hash.substring(1);
document.getElementById("result").innerHTML = search;
XSS url:
http://example.com/#<script>alert('DOM XSS')</script>
{XSS}
-
How to prevent
- 預先處理輸入
- 過濾可能是html/js內容的特殊符號 (ex:"<",">",""","'")
- 直接轉換成html編碼(ex:"<" => "<" ">" 變成 ">"):顯示為文字 而非js碼
-
PHP :
htmlspecialchars()
-
Java :
StringEscapeUtils.escapeHtml()
-
js :
element.textContent = str;
-
PHP :
-
url編碼:同理
- 內容安全策略(CSP):在header上面加入一些選項
{XSS}
-
How to prevent
- 用安全的插入方法
- 直接插入成html顯然不是什麼安全的方法
- 插入成物件的文字比較安全
{XSS}
-
How to prevent
- 用安全的插入方法
- 直接插入成html顯然不是什麼安全的方法
- 插入成物件的文字比較安全

// 危險喔
document.getElementById('message').innerHTML = userInput;
document.write(userInput);
// 安全喔
document.getElementById('message').textContent = userInput;
// 只有修改文字部分
{SQL injection}
-
SQL語法有漏洞?
<?php
$username = $_GET['username'];
$result = mysql_query("SELECT * FROM users WHERE username='$username'");
?>
{SQL injection}
-
正常人
-
H3cker
<?php
$username = $_GET['username']; // melon
$result = mysql_query("SELECT * FROM users WHERE username='melon'");
?>
<?php
$username = $_GET['username']; // 輸入 '
$result = mysql_query("SELECT * FROM users WHERE username='''");
?>
報錯囉
{SQL injection}
-
H3cker
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1'");
?>
多的單引號怎麼辦?
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1'");
?>
多的單引號怎麼辦?
{SQL injection}
-
H3cker
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1'");
?>
多的單引號怎麼辦?
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1'");
?>
多的單引號怎麼辦?
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1'");
?>
多的單引號怎麼辦?
<?php
$username = $_GET['username']; // 輸入 ' OR 1=1" --
$result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1" -- '");
?>
SQL的註解:
單行 --
/* 包住 */
{SQL injection}
-
融會貫通:
- 善用前述邏輯
- 反推server端的完整SQL指令
上網複製別人的範本爆搜看看

{CRLF}
-
Carriage Return Line Feed
- 前面說到HTTP協議裡面的 "\r\n" 回車 + 換行
- 在HTTP協議裡面負責換行 + 分隔Header & Body
- example:
HTTP/1.1 302 Found
Host :example.com\r\n
header內容....\r\n
\r\n
body內容....
{CRLF}
-
Carriage Return Line Feed
- 前面說到HTTP協議裡面的 "\r\n" 回車 + 換行
- 在HTTP協議裡面負責換行 + 分隔Header & Body
- 如果我如果我在Host裡面加入\r\n 呢?
HTTP/1.1 302 Found
Host :example.com\r\n
header內容....\r\n
\r\n
body內容....
HTTP/1.1 302 Found
Host :example.com\r\n \r\n <script>alert(1)</script> \r\n
header內容....\r\n
\r\n
body內容....
{CRLF}
-
Carriage Return Line Feed
- 瀏覽器看到的不是這樣
- 它覺得後面的<script>
是body的一部分
HTTP/1.1 302 Found
Host :example.com\r\n \r\n <script>alert(1)</script> \r\n
header內容....\r\n
\r\n
body內容....
HTTP/1.1 302 Found
Host :example.com\r\n
\r\n
<script>alert(1)</script> \r\n
header內容....\r\n
\r\n
原本body內容....
這不就是XSS🤨🤨
{CRLF}
-
如果Hacker能操縱Server Client傳輸的header
-
302 Found=>redirect
- 把reflected XSS url塞在"\r\n"後面
- 幹走cookie & session
- 把釣魚連結塞在"\r\n"後面
- 把reflected XSS url塞在"\r\n"後面
-
302 Found=>redirect
-
預防方法
- 對要redirect的內容urlEncode
- 檢查respond header的內容 過濾掉多的"\r\n"
{CSRF}
-
Cross Site Request Forgery(跨站偽請求)
- 有餅乾的仙貝芝士之後(有點餓了)就很好理解了

{CSRF}
-
User訪問+login
web A -
A網站生成並回傳cookie
-
User跑去逛釣魚網站
釣魚網站用剛剛的餅乾發Request給web A -
A辨識Cookie後覺得是
User在操作 便准許了操作(例如:把錢全部轉走)


{CSRF}

{CSRF}
-
How to prevent
- 增加驗證方式
- 兩步驟驗證(驗證碼等等)
- CSRF token:打開頁面時才隨機生成的token
{Command Injection}
-
有些function可以執行shell指令
- 方便完成複雜的操作 ex: 系統管理、本機檔案操作
- 工程師留下維修後門
-
EX :
- php
-
python :
- os.system()
- subprocess.call()
- os.popen()
-
常發生於ping測試
- IOT聯網
{Command Injection}
import os
domain = user_input() # google.com
os.system('ping ' + domain)
控制符=>分號(;)
cmd1 ; cmd2
先執行cmd1 再執行cmd2
想想user_input該放啥
舉例:python
{題單}
- webdecode:https://play.picoctf.org/practice/challenge/427
- unminify:https://play.picoctf.org/practice/challenge/426
- Inspect HTML:https://play.picoctf.org/practice/challenge/275
-
includes:https://play.picoctf.org/practice/challenge/274
-
Cookies:https://play.picoctf.org/practice/challenge/173
-
GET aHEAD:https://play.picoctf.org/practice/challenge/132
-
dont-use-client-side:https://play.picoctf.org/practice/challenge/66
-
logon:https://play.picoctf.org/practice/challenge/46
-
insp3ct0r:https://play.picoctf.org/practice/challenge/18
------------------------------------------------------------------------------ -
sql injection
-
Irish-Name-Repo 1:https://play.picoctf.org/practice/challenge/80
-
-
command injection
-
https://play.picoctf.org/practice/challenge/202
-
CTF-Web
By idoit_melon
CTF-Web
- 177