講師:堇姬 @ Izcc-ctf
2023.12.1
CTF-request & Path traversal
堇姬Naup(網管/美宣)
成電二年級/幽夜工作室繪師/台灣好厲駭學員
CKCSC36
DC : naup_sumire_hime
IG : ckcsc36th_naup
涉獵C++、C、python、遊戲(tkinter、pygame)、資安(Web、Crypto)、AI、flask、html/css/js、 PHP、DC bot。
喜歡看輕小說、動畫、Vtuber、打音遊,也喜歡看百合,就是一個長年混跡ACG的宅女。
夢想是可以成為很電的駭客跟繪師,也想自己寫出一個AI老婆。
本日重點
-
request & response
-
burpsuite
-
Path
-
path traversal
request & response
Request格式
start line
header
CRLF
Body
Response格式
start line
header
CRLF
Body
request
response
start-line
因應請求、回應,分別稱為
請求行 request-line
狀態行 status-line
request-line
方法 (method)、
請求目標 (request-target)、
HTTP 版本 (HTTP-version)
HTTP Method
- GET:向指定的資源發出「顯示」請求。
- POST:向指定資源提交資料,並且Body中可帶傳輸的資料。
- PUT:上傳或取代指定的資源。
- PATCH : 覆蓋資料
- DELETE:刪除指定的資源。
- HEAD:與GET相似,但只會取得標頭與HTTP狀態。
- OPTIONS:回傳這個伺服器支援的所有HTTP Method。
- TRACE:回傳收到的請求內容。
HTTP-version
HTTP 版本
Ex : HTTP/1.1、HTTP/1.0
status-line
HTTP 版本 (HTTP-version)、
狀態碼 (status-code)、
原因短語 (reason-phrase)
status-code
-
1xx – 連接正在進行中
-
2xx – 請求成功完成,伺服器給了瀏覽器預期的響應
-
3xx –這個請求被收到了,但是需要重新定向
-
4xx –客戶端看起來可能發生了錯誤,妨礙了伺服器的處理
-
5xx – 客戶端的請求是有效的,但伺服器未能完成請求
-
200 -> 一切都正常
-
301 -> 永久性轉址
-
302 -> 暫時性轉址
-
404 -> 該網頁找不到
-
500 -> 內部服務器錯誤
header
紀錄各種資料/設定,等基本信息
可以想像是包裹外貼的那張紙
Host: echo.paw.cloud
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Connection: close
Content-Length: 136
Host
要訪問的目標主機的域名或IP
Content-Type
指示請求中攜帶的數據類型(上方的是JSON格式、UTF-8編碼)
User-Agent
發送請求的客戶端應用或瀏覽器信息("Mozilla Firefox"瀏覽器發送,版本是53.0,在Macintosh操作系统上)
Connection
暗示連結類型(close表示請求完後連結會關閉)
Content-Length
後續要讀取消息的長度
Macintosh 128K
CRLF
(carriage return followed by line feed)
網際網路嚴謹的換行標準
\r\n
CR = 回車 (Carriage Return)
LF = 換行 (Line Feed)
- 許多語言表示為: \n
- Unicode 中為 0x0A (十進制的 10)
- 許多語言表示為: \r
- Unicode 中為 0x0D (十進制的 13)
雖然多數語言 \n 就能做到換行,規範上,仍以 \r\n 為主。
CR跟LF差異
- 在不同作業系統中,CR 和 LF 的組合方式不同
Windows -> CRLF
Unix/Linux -> LF
- CR通常表示將游標移動到當前行的起始位置,但不會移動到下一行
- LF符號通常表示移動游標到下一行的起始位置,實現文本的換行
body
訊息主體,像包裹的箱子,是訊息中乘載資料的地方。
Burpsuite
比較常用的是proxy跟repeater
intercept is off or on :
不會擷取request
擷取下一次的request
open browser :
打開一個瀏覽器,burpsuite會擷取這個瀏覽器的request
擷取到的request
所有收到的request的歷史
我可以把該request送到repeater這樣我就可以修改封包後重新request
- 左邊是request,你可以修改內容
- 右邊是收到的response
- 按下send可以發送請求
題目
打開來看到這個,我想可以使用burpsuite
收到了三個,有個叫做/burp5u17e_ch4ll3nge看起來很奇怪
嘗試把他送到repeater,會看到讓我們開始挑戰的字句
把challenge改成1就可以開始,同時也可以收到第一段flag
後面兩段就跟burpsuite沒關係了,提示:
一個是curl,一個是python request
有興趣可以自己解
路徑(Path)
可以想像成一個目錄可以想像成一個櫥櫃,假如我要找到一個檔案可以透過記錄需要依序打開哪個櫥櫃來找到
/Home/Document/naup/
指在目錄 Home
底下有 Document
目錄,在Document
目錄底下有 naup
目錄
可以使用 ../
來表示「到上一層目錄」
Path traversal
架設網站的時候,會將網頁放在伺服器的某個目錄之下(假設有下列這個)
- /server/templates/haha.html
- /server/app.py
網址為 https://naup.com
- https://naup.com/templates/haha.html
對應到/server/templates/haha.html
若請求
然而如果我嘗試請求
https://naup.com/templates/haha.html/../../app.py
-
如果沒有過濾就會抓到app.py
有時使用../會被瀏覽器解析,故要將
../
進行 Url Encode 變成..%2F
-
產生原因
- 伺服器端的檔案權限沒有設定正確
- 服務 (Serving) 的目錄,不是白名單的方式,而是由伺服器端的程式碼使用「使用者傳入的字串」組成 目錄字串所造成的
app.get('/templates/:filename', function(req, res){
var filename = req.params.filename,
path = `templates/${filename}`;
return res.sendFile(path, {root: '/server'});
});
如何防禦?
可以直接設定好客戶端訪問的權限
app.get('/templates/:filename', function(req, res){
var filename = req.params.filename,
path = `${filename}`;
return res.sendFile(path, {root: '/server/templates/'});
});
題目
Bento
By naup96321
Bento
- 28