## 首頁(其他picoCTF writeup) https://hackmd.io/@sunfrancis12/ry_LLAgp3 作者: [台中教育大學 白帽社](https://hackmd.io/@ntcuhack/index) -sunfrancis12 ## picobrowser 這題建議使用burp,但是不用擔心,這題十分的簡單,題目敘述如下 ![](https://hackmd.io/_uploads/ryuxvxiph.png) 題目說只有使用`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啟動 ![](https://hackmd.io/_uploads/SkVmooH6n.png) 點開proxy,進到intercept ![](https://hackmd.io/_uploads/Sy6wijB62.png) 我們這裡要打開Intercept功能,如字面上的意思,intercept可以將封包攔截,同時使用者也可以更改封包的內容,然後在送出 Intercept開啟後,我們打開browser,結果如下 ![](https://hackmd.io/_uploads/HytV2jB6h.png) 貼上連結,會發現進不去網頁,那是因為他的http request被我們攔截了,我們點擊forward讓他送出去 ![](https://hackmd.io/_uploads/SksVy2B62.png) ## 開始解題 我們要做的事情就是把客戶端`User-Agent`修改成`picobrowser` 進去網站,點擊flag按鈕,他會送出一個http request ![](https://hackmd.io/_uploads/H1G7Teoph.png) 封包內容如下: ``` 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 ```