## 首頁(其他picoCTF writeup)
https://hackmd.io/@sunfrancis12/ry_LLAgp3
作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12
## picobrowser
這題建議使用burp,但是不用擔心,這題十分的簡單,題目敘述如下

題目說只有使用`picobrowser`瀏覽器才能拿到flag,那麼我們要做的事情就很簡單了,我們來看看http request的結構
## 認識http request
以下是我擷取到的封包
```
GET /problem/28921/ HTTP/1.1
Host: jupiter.challenges.picoctf.org
Sec-Ch-Ua:
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: ""
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
```
Host:瀏覽器存取的Host名稱,因一個IP可綁定多個不同domain,此時需知道Host才知道要對應哪個伺服器。
User-Agent:瀏覽器名稱和版本&作業系統名稱和版本。
Accept:告訴伺服器瀏覽器接受的類型,但伺服器有最終決定權選擇傳送類型。
Accept-Language:瀏覽器接受的語言,q值表示語言的優先權重。ex.zh-TW,zh;q=0.9,en-US;q=0.8,en;q=07(第一順位中文、第二順位美語、第三順位英文)。
Accept-Encoding:瀏覽器支援的壓縮格式,大部分瀏覽器都支援gzip壓縮。伺服器會壓縮內容後傳給瀏覽器,節省下載時間和頻寬。
Date:傳送瀏覽器時間給伺服器,讓伺服器知道瀏覽器目前時間。
Sec-fetch-*: https://ithelp.ithome.com.tw/articles/10219728
Cookie:記錄目前瀏覽器記錄了哪些資訊。每一個request都會包含cookie。
Connection:設定Keep-Alive保持連線時間,減少TCP三項交握的次數,提高傳輸效率。(HTTP 1.0沒有這個header)
> 更多詳細內容:https://medium.com/ttyy2985/http%E5%89%8D%E5%BE%8C%E7%AB%AF%E5%82%B3%E8%BC%B8%E6%B5%81%E7%A8%8B-8ee40ffca1bd
## Burp啟動

點開proxy,進到intercept

我們這裡要打開Intercept功能,如字面上的意思,intercept可以將封包攔截,同時使用者也可以更改封包的內容,然後在送出
Intercept開啟後,我們打開browser,結果如下

貼上連結,會發現進不去網頁,那是因為他的http request被我們攔截了,我們點擊forward讓他送出去

## 開始解題
我們要做的事情就是把客戶端`User-Agent`修改成`picobrowser`
進去網站,點擊flag按鈕,他會送出一個http request

封包內容如下:
```
GET /flag HTTP/1.1
Host: jupiter.challenges.picoctf.org
Sec-Ch-Ua:
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: ""
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://jupiter.challenges.picoctf.org/problem/28921/
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
```
我們將客戶端的內容修改成以下樣子,並送出(forward)
```
User-Agent: picobrowser
```
~~這題很靠北~~ 他又重新將我們導向至`/problem/28921/flag`,也是一樣修改`User-Agent`內容
最後封包內容如下:
```
GET /problem/28921/flag HTTP/1.1
Host: jupiter.challenges.picoctf.org
Upgrade-Insecure-Requests: 1
User-Agent: picobrowser
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Sec-Ch-Ua:
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: ""
Referer: https://jupiter.challenges.picoctf.org/problem/28921/
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
```
送出後就拿到flag了
## 法二:Curl
使用curl也可以修改客戶端`User-Agent`內容,指令如下
```
curl https://jupiter.challenges.picoctf.org/problem/28921/flag --user-agent picobrowser
```