--- lang: zh-tw tags: CTF --- [Tool]:https://reqbin.com/ [API]: https://gist.github.com/aszx87410/3873b3d9cbb28cb6fcbb85bf493b63ba [APIv2]: https://gist.github.com/aszx87410/1e5e5105c1c35197f55c485a88b0328a [API-Ex]: https://gist.github.com/aszx87410/0b0d3cabf32c4e44084fadf5180d0cf4 HTTP GAME:Lidemy HTTP Challenge 實戰 writeup === 遊戲網址:https://lidemy-http-challenge.herokuapp.com curl版writeup:https://hackmd.io/abclatKlTE2wOS31MBEnWQ # 0xFF 前言 在因緣際會之下接觸到了這個CTF,想說寫個WriteUp來記錄,順便加深個印象這樣。 很適合剛接觸資安的新人,可以了解GET、POST的作用等。 >其實只是怕幾天之後就忘光了(X >[name=羽澤] >要寫文字真是件困難的事呢,不管怎麼寫都感覺怪怪的 >[name=lamacat] # 0x00 故事開頭 :::info 安安,歡迎來到 Lidemy HTTP Challenge。   這裡一共有 10 道關卡,每一關的網址皆為 /lvX,X 即為關卡的數字。 但只知道網址是沒有用的,需要搭配正確的 token 才能順利進入關卡,傳入 token 的方式為 query string,例如 /lv1?token=xxx。   另外,為了讓你方便辨別這是 token,token 的內容一定是用一個大括弧刮起來的字串。 每一關都會有提示,只要按照提示照著做,就能拿到前往下一關的 token。   你可以用任何你擅長的工具來通關,只靠瀏覽器的話有些關卡是沒辦法通過的喔!   準備好了嗎?   第一關的 token 為:{GOGOGO}   附註:所以第一關網址為 /lv1?token={GOGOGO},不是 /lv1?token=GOGOGO,之後的關卡也是一樣 如果你需要提示的話,在網址最後面加上 &hint=1 就會看到提示了,例如說:/lv1?token={GOGOGO}&hint=1 ::: 作者很貼心的告訴了玩家們怎麼進入第一關的方法XD 還有如果想不到解決方法可以去看看Hint >透過GET方式,傳送多值的時候記得使用&連接 >例如: name=lamacat&test=true >[name=lamacat] # 0x01 第一關 :::spoiler 關卡傳送門 >https://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO} ::: :::info **# 故事 #** 啊...好久沒有看到年輕人到我這個圖書館了,我叫做 lib,是這個圖書館的管理員 很開心看到有年輕人願意來幫忙,最近圖書館剛換了資訊系統,我都搞不清楚怎麼用了... 這是他們提供給我的文件,我一個字都看不懂,但對你可能會有幫助: https://gist.github.com/aszx87410/3873b3d9cbb28cb6fcbb85bf493b63ba   先把這文件放一旁吧,這個待會才會用到 你叫做什麼名字呢?用 GET 方法跟我說你的 name 叫做什麼吧! 除了 token 以外順便把 name 一起帶上來就可以了 ::: :::spoiler Hint >用 **GET** 方式傳送的資料會被附在 **URL** 上面當作網址,所以傳了 token 就會變 ==?token=xxx== 再加上name傳送的話就是 ==?token=xxx&name=xxx== ::: ## 解題思路 一開始關卡提供了[文件][API],目前還用不到 >文件其實就是 [API] 啦www,後面也會這稱呼 >[name=lamacat] 管理員請我們先將 **name** 告訴它,所以只要在網址的最後面加上 **&name=name** 就可以囉 **&name=** 後面就是隨便取個名子就好了。 :::success **# 通關 #** 啊...原來你叫 lamacat 啊!下一關的 token 是: <font color="#dff0d8">{HellOWOrld}</font> ::: >原來是草尼貓啊 >[name=羽澤] # 0x02 第二關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv2?token={HellOWOrld} ::: :::info **# 故事 #** 我前陣子在整理書籍的時候看到了一本我很喜歡的書,可是現在卻怎麼想都想不起來是哪一本...   我只記得那本書的 id 是兩位數,介於 54~58 之間,你可以幫幫我嗎? 找到是哪一本之後把書的 id 用 GET 傳給我就行了。 ::: :::spoiler Hint >還記得之前第一關給的文件嗎?要從文件裡面選到適當的 API 並 <font color="#f00">**找出書籍**</font> 不確定是哪本書的話可以多試幾次看看 「把書的 id 用 GET 傳給我」跟上一關的「用 GET 方法跟我說你的 name 叫什麼」是一樣的 除了 token 以外,要多帶一個 id 上來 ::: ## 解題思路 這關看似要用到 [API] 了,但其實沒有,只需要在網址後面加上 id 的參數 然後從 54 開始遞增,回傳,管理員就會告訴你是不是它要找的那本書了 :::success **# 通關 #** 啊!就是這本書,太謝謝你了。下一關的 token 為:<font color="#dff0d8">{5566NO1}</font> ::: # 0x03 第三關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv3?token={5566NO1} ::: :::info **# 故事 #** 真是太感謝你幫我找到這本書了!   剛剛在你找書的時候有一批新的書籍送來了,是這次圖書館根據讀者的推薦買的新書,其中有一本我特別喜歡,想要優先上架。 書名是《大腦喜歡這樣學》,ISBN 為 9789863594475。   就拜託你了。 新增完之後幫我把書籍的 id 用 GET 告訴我。 ::: :::spoiler Hint >還記得之前第一關給的文件嗎?要從文件裡面選到適當的 API 並 <font color="#f00">**新增書籍**</font> 「把書籍的 id 用 GET 告訴我」跟上一關的「把書的 id 用 GET 傳給我」是一樣的喔 除了 token 以外,要多帶一個 id 上來 ::: ## 解題思路 這關就會需要使用到先前提供的 [API] 了以及能發送 HTTP Request 功能的工具 :::info 有人可能不會用 [API],其實很簡單,按照此 [API] 提供的資訊 我們只要將 **Base URL** 加上 **path** 就可以囉 舉例 [API] **獲取單一書籍** 功能的使用方式就是 `https://lidemy-http-challenge.herokuapp.com/api/book/1` ::: >注意看一下 [API],這次 **新增書籍** 功能不再是 GET 的方式,而是 **POST**,所以就不能再用網址傳值囉 >不懂為什麼,有興趣多了解,就 Google 發問吧~~ >[name=lamacat] >有事問狗,沒事也問狗 >[name=羽澤] 所以,這裡使用 [Post HTTP Requests Online][Tool] 來操作發送 HTTP Request 依照關卡所述,我們會用到 [API] 裡面 **新增書籍** 的功能,並且要透過 **POST** 方式去傳送資料 所以,我們要做的事情是使用 POST 方式傳送資料,並有兩筆參數資料 並且要注意,[API] 有提到 **POST** 以及 **PATCH** 的 **content type** 為:**application/x-www-form-urlencoded**,操作時,要記得要弄對唷 3. 修改 content type 為 **application/x-www-form-urlencoded** 我們來用[工具][Tool]操作就是 1. 填好網址,在 **Content** 的地方填入參數資料,順便選好格式 **FORM URL Encoded (application/x-www-form-urlencoded)** 2. 選擇傳送 Request 的 Method(方式)是 **POST** 3. 發送 Request \~~ >用工具方便的地方,就是填好必要的資料、參數,剩下工具都會自動處理 >[name=lamacat] :::success **# 通關 #** 這樣子讀者就能趕快看到這本新書了,謝謝!下一關的 token 為:<font color="#dff0d8">{LEarnHOWtoLeArn}</font> ::: :::spoiler 額外補充 這關 HTTP Request 的 Raw 格式,具體長這樣 可以注意的是 Content-Length 是自動計算生成的,並非設定 隨著 Request 封包變化,Content-Length 數值會自動重新計算 ``` POST /api/books HTTP/1.1 Host: lidemy-http-challenge.herokuapp.com Content-Type: application/x-www-form-urlencoded Content-Length: 87 name=%E5%A4%A7%E8%85%A6%E5%96%9C%E6%AD%A1%E9%80%99%E6%A8%A3%E5%AD%B8&ISBN=9789863594475 ``` ::: # 0x04 第四關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn} ::: :::info **# 故事 #** 我翻了一下你之前幫我找的那本書,發現我記錯了...這不是我朝思暮想的那一本。 我之前跟你講的線索好像都是錯的,我記到別本書去了,真是抱歉啊。   我記得我想找的那本書,書名有:「世界」兩字,而且是村上春樹寫的,可以幫我找到書的 id 並傳給我嗎? ::: :::spoiler Hint >還記得之前第一關給的文件嗎?要從文件裡面選到適當的 API 並<font color="#f00"> **找到書籍**</font> 「找到書的 id 並傳給我」跟上一關的「把書籍的 id 用 GET 告訴我」是一樣的喔 除了 token 以外,要多帶一個 id 上來 ::: ## 解題思路 這關一樣用到 [API],只要透過 [API] 的 **獲取所有書籍** 功能即可 按照 [API] 裡的範例,我們只要將 `q` 參數改成管理員要找的關鍵字 **世界** 即可 網址如下 `https://lidemy-http-challenge.herokuapp.com/api/books?q=世界` 回傳的資料是 JSON 格式,可以選擇用 [JSON Viewer](http://jsonviewer.stack.hu/) 之類的工具或直接透過 Ctrl+F 搜尋作者名子,即可找到那本書 :::success **# 通關 #** 沒錯!這次我很確定了,就是這本!下一關的 token 為:<font color="#dff0d8">{HarukiMurakami}</font> ::: # 0x05 第五關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv5?token={HarukiMurakami} ::: :::info **# 故事 #** 昨天有個人匆匆忙忙跑過來說他不小心捐錯書了,想要來問可不可以把書拿回去。 跟他溝通過後,我就把他捐過來的書還他了,所以現在要把這本書從系統裡面刪掉才行。   那本書的 id 是 23,你可以幫我刪掉嗎? ::: :::spoiler Hint >還記得之前第一關給的文件嗎?要從文件裡面選到適當的 API 並 <font color="#f00">**刪除書籍**</font> 若是有做對的話,就會拿到下一關的 token 囉 ::: ## 解題思路 根據 [API] 描述,如果我們要 **刪除書籍** ,需要透過 **DELETE** 方式來刪除資料,操作如下 按照 [API] 的指示,編寫好我們的網址,長這個樣子 `https://lidemy-http-challenge.herokuapp.com/api/books/23` 接者用到[工具][Tool],我們只要把網址貼上,Method 選擇 DELETE 即可,送出資料 :::success **# 通關 #** 咦...是刪掉了沒錯,但總覺得哪裡怪怪的,算了,先這樣吧!下一關的 token 為:<font color="#dff0d8">{CHICKENCUTLET}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ``` DELETE /api/books/23 HTTP/1.1 Host: lidemy-http-challenge.herokuapp.com ``` ::: # 0x06 第六關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv6?token={CHICKENCUTLET} ::: :::info **# 故事 #** 我終於知道上次哪裡怪怪的了!   照理來說要進入系統應該要先登入才對,怎麼沒有登入就可以新增刪除... 這太奇怪了,我已經回報給那邊的工程師了,他們給了我一份新的文件:https://gist.github.com/aszx87410/1e5e5105c1c35197f55c485a88b0328a   這邊是帳號密碼,你先登入試試看吧,可以呼叫一個 /me 的 endpoint,裡面會給你一個 email。 把 email 放在 query string 上面帶過來,我看看是不是對的。   帳號:admin 密碼:admin123 ::: :::spoiler Hint >從這關以後要開始用這份[新的文件](https://gist.github.com/aszx87410/1e5e5105c1c35197f55c485a88b0328a)了 關於驗證方式請 Google:http basic authorization ::: ## 解題思路 這關開始使用了新的 [API][APIv2],版本為 2;==為方便辨識,新版 [API][APIv2],後稱 [APIv2]== 並且 [APIv2] 的所有功能都需要驗證資訊才能使用 首先,關卡就需要我們透過 /me 來取得一個 email 這個 /me 其實就是 [APIv2] 的其中一個功能 **獲取個人資訊** 一樣使用這個[工具][Tool],填入網址和資料 Method 選擇 GET Authorization 選擇 Basic Auth Username 填入 admin Password 填入 admin123 發送之後,就會取的回傳的資料 ```json {"username":"admin","email":"lib@lidemy.com"} ``` 將email回傳之後,就通關囉 :::success **# 通關 #** 對對對,就是這個,這樣才對嘛!下一關的 token 為:<font color="#dff0d8">{SECurityIsImPORTant}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ``` GET /api/v2/me HTTP/1.1 Authorization: Basic YWRtaW46YWRtaW4xMjM= Host: lidemy-http-challenge.herokuapp.com ``` ::: # 0x07 第七關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv7?token={SECurityIsImPORTant} ::: :::info **# 故事 #** 那邊的工程師說系統整個修復完成了,剛好昨天我們發現有一本書被偷走了... 這本書我們已經買第五次了,每次都被偷走,看來這本書很熱門啊。 我們要把這本書從系統裡面刪掉,就拜託你了。   對了!記得要用新的系統喔,舊的已經完全廢棄不用了。   書的 id 是 89。 ::: :::spoiler Hint >這關記得要用上一關給的新系統 [APIv2] 不是原本的 [API] 喔 找到正確的書籍並<font color="#f00">**刪除**</font>即可 ::: ## 解題思路 這關跟第五關很像喔,只是多了驗證 使用[工具][Tool],填好網址,Method 選 DELETE,將 Authorization 認證資訊寫好 送出 Request,就通關啦 :::success **# 通關 #** 希望下一次進這本書的時候不會再被偷走了。下一關的 token 為:<font color="#dff0d8">{HsifnAerok}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ```HTML RAW DELETE /api/v2/books/89 HTTP/1.1 Authorization: Basic YWRtaW46YWRtaW4xMjM= Host: lidemy-http-challenge.herokuapp.com ``` ::: # 0x08 第八關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv8?token={HsifnAerok} ::: :::info **# 故事 #** 我昨天在整理書籍的時候發現有一本書的 ISBN 編號跟系統內的對不上,仔細看了一下發現我當時輸入系統時 key 錯了。 哎呀,人老了就是這樣,老是會看錯。   那本書的名字裡面有個「我」,作者的名字是四個字,key 錯的 ISBN 最後一碼為 7,只要把最後一碼改成 3 就行了。 對了!記得要用新的系統喔,舊的已經完全廢棄不用了。 ::: :::spoiler Hint >這關記得要用新給的 [APIv2],不是原本的 [API] 喔 找到正確的書籍並<font color="#f00">**更新**</font>即可 ::: ## 解題思路 這關也是跟第四關很像,大同小異,我們需要先找到那本書,再來透過 **PATCH** 的方式去更新資料 在[工具][Tool]上填好資料以及驗證資訊,送出 Request,即可查詢到相關書本資料 由於回傳的資料是 JSON 格式,可以選擇用 [JSON Viewer](http://jsonviewer.stack.hu/) 之類的工具 轉換成容易閱讀的格式,上述工具的具體操作,只要把 JSON 資料填到 Text 的欄位,點下旁邊的 Viewer,就會看到整齊的資料了,接下來只要找到符合條件的書即可 最後找到符合的資料,如下 ```json {"id":72,"name":"日日好日:茶道教我的幸福15味【電影書腰版】","author":"森下典子","ISBN":"9981835427"} ``` 接者透過 [APIv2] 的資訊,在[工具][Tool]上填好如下資訊 網址https://lidemy-http-challenge.herokuapp.com/api/v2/books/72 Merhod:PATCH Authorization 認證資訊 Content 選擇 FORM URL Encoded (application/x-www-form-urlencoded) ==將要更新的資料填好== name=日日好日:茶道教我的幸福15味【電影書腰版】 ISBN=9981835423 送出 Request :::success **# 通關 #** 希望之後他們能引進語音輸入系統,我就只要講講話就好。下一關的 token 為:<font color="#dff0d8">{NeuN}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ``` PATCH /api/v2/books/72 HTTP/1.1 Authorization: Basic YWRtaW46YWRtaW4xMjM= Host: lidemy-http-challenge.herokuapp.com Content-Type: application/x-www-form-urlencoded Content-Length: 203 name=%E6%97%A5%E6%97%A5%E5%A5%BD%E6%97%A5%EF%BC%9A%E8%8C%B6%E9%81%93%E6%95%99%E6%88%91%E7%9A%84%E5%B9%B8%E7%A6%8F15%E5%91%B3%E3%80%90%E9%9B%BB%E5%BD%B1%E6%9B%B8%E8%85%B0%E7%89%88%E3%80%91&ISBN=9981835423 ``` ::: # 0x09 第九關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv9?token={NeuN} ::: :::info **# 故事 #** API 文件裡面有個獲取系統資訊的 endpoint 你記得嗎? 工程師跟我說這個網址不太一樣,用一般的方法是沒辦法成功拿到回傳值的。   想要存取的話要符合兩個條件: 1. 帶上一個 X-Library-Number 的 header,我們圖書館的編號是 20 2. 伺服器會用 user agent 檢查是否是從 IE6 送出的 Request,不是的話會擋掉 順利拿到系統資訊之後應該會有個叫做 version 的欄位,把裡面的值放在 query string 給我吧。 ::: :::spoiler Hint >試著去想想看,伺服器是怎麼知道 request 是什麼版本的瀏覽器? ::: ## 解題思路 只要能知道伺服器是怎麼檢查的,就有方法可以通過它,原本的敘述裡面也有給關鍵字了 按照關卡說明,我們該怎麼做呢?只要把關卡要求的條件加入 header 就可以了 具體該怎麼做呢? 首先,在[工具][Tool]內把網址跟驗證資訊都先填好,再來在 header 裡面加上條件 ``` X-Library-Number:20 user-agent:MSIE 6.0 ``` >就是這麼簡單 >[name=lamacat] 發送Request,就會得到回應 ```JSON {"message":"success","version":"1A4938Jl7","owner":"lib","createdAt":"121290329301"} ``` 只要將 version 回傳關卡,就通關啦 :::success **# 通關 #** 限制這麼多都被你突破了,真有你的。要不要考慮以後來我們圖書館當工程師啊?下一關的 token 為:<font color="#dff0d8">{duZDsG3tvoA}</font> ::: # 0x0A 第十關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv10?token={duZDsG3tvoA} ::: :::info **# 故事 #** 時間過得真快啊,今天是你在這邊幫忙的最後一天了。   我們來玩個遊戲吧?你有玩過猜數字嗎?   出題者會出一個四位數不重複的數字,例如說 9487。 你如果猜 9876,我會跟你說 1A2B,1A 代表 9 位置對數字也對,2B 代表 8 跟 7 你猜對了但位置錯了。   開始吧,把你要猜的數字放在 query string 用 num 當作 key 傳給我。 ::: :::spoiler Hint >「把你要猜的數字放在 query string 用 num 當作 key 傳給我」就是在 URL 加上 &num=1234 就可以開始玩猜數字囉!不會玩猜數字的可以先去找猜數字怎麼玩 ::: ## 解題思路 恭喜各位達到最後一關了,作者最後要玩個猜數字的遊戲,透過num這個參數來傳值,相信大家應該習慣用 GET 傳遞參數了XD 怎麼玩猜數字呢? 簡單來說,出題者會想出一個 4 位數字,然後玩家就是隨便猜 1-9 之間的數字。例如:1234 接下來,網頁會提示幾 A 幾 B,A 為正確的數在正確的位置上,B 為正確的數在不對的位置上 然後就是要去靠 A 和 B 的提示來猜出正確答案了。 >怎麼辣麼好玩 >[name=羽澤] :::spoiler 答案 >**9613** :::   :::success **# 通關 #** 很開心在這裡的時光能有你一起陪伴,讓我的生活不再那麼一成不變,很開心認識你,下次有機會再一起玩吧!   The End,恭喜破關!   author: huli@lidemy.com https://www.facebook.com/lidemytw/   附註: 原本遊戲只規劃到這邊,第十關就是最後一關。 後來我有加了一些新關卡但難度較高,如果你還想挑戰看看,下一關的 token 為 {IhateCORS} ::: Extra Stage === >恭喜你解鎖了 Extra Stage,就跟音Game多一首歌給你打一樣興奮對吧((並沒有 >[name=羽澤] >少年啊,成為神話吧 >[name=残酷な天使のテーゼ] # 0x0B 第十一關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv11?token={IhateCORS} ::: :::info **# 故事 #** 嘿!很開心看到你願意回來繼續幫忙,這次我們接到一個新的任務,要跟在菲律賓的一個中文圖書館資訊系統做串連 這邊是他們的 API 文件,你之後一定會用到:https://gist.github.com/aszx87410/0b0d3cabf32c4e44084fadf5180d0cf4   現在就讓我們先跟他們打個招呼吧,只是我記得他們的 API 好像會限制一些東西就是了... ::: :::spoiler Hint >伺服器會檢查 origin 這個 header,只要騙過伺服器就行了 ::: ## 解題思路 這關用到了新 [API][API-Ex],==為方便辨識,新 [API][API-Ex],後稱 [API-Ex]== 不要跟前面搞混用錯囉 首先,關卡說要先跟對方打聲招呼,但直接 GET 之後反而可能會得到 >您的 origin 不被允許存取此資源,請確認您是從 `lidemy.com` 送出 request。 > 這表示伺服器有採用 header 中的 origin 來做辨識,解法也很簡單 就在 header 加上一條 `origin` 來自 `lidemy.com` 就好啦 :::success **# 通關 #** Hello! 下一關的 token 為:<font color="#dff0d8">{r3d1r3c7}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ``` GET /api/v3/hello HTTP/1.1 Host: lidemy-http-challenge.herokuapp.com origin: lidemy.com ``` ::: # 0x0C 第十二關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv12?token={r3d1r3c7} ::: :::info **# 故事 #** 打完招呼之後我們要開始送一些書過去了,不過其實運送沒有你想像中的簡單,不是單純的 A 到 B 而已 而是像轉機那樣,A 到 C,C 才到 B,中間會經過一些轉運點才會到達目的地...算了,我跟你說那麼多幹嘛 現在請你幫我把運送要用的 token 給拿回來吧,要有這個 token 我們才能繼續往下一步走 ::: :::spoiler Hint >你會發現你呼叫 API 以後它並沒有直接回傳結果,而是轉址到其他地方(或許中間還經歷不只一個地方) 仔細研究這些地方吧! ::: ## 解題思路 首先看到關卡這樣描述,再來透過 [API-Ex] **獲取運送 token** 後~~ 可以發現,網址被轉跳後,得到了以下訊息 >我已經把運送要用的 token 給你囉,請你仔細找找 可以發現事情不簡單,根本沒看到任何像是 token 的東西呢www 關卡都這麼描述了,肯定別有用心 這時,我們打開瀏覽器的**開發人員工具 (DevTools)**,切換到**網路 (Network)** 的標籤頁 >使用自己習慣的瀏覽器即可,這裡使用 Chrome 操作 >[name=lamacat] 並且開啟**網頁重載 \ 重導向時不要清除log (Do not clear on page reload / navigation)** 這時,再重新透過 [API-Ex] **獲取運送 token**,可以發現取得了三個log分別是 deliver_token --> stopover --> deliver_token_result deliver_token_result 就是我們看到的那段文字 deliver_token, stopover 都沒有實際的資料,但可以注意到 Header 的部分 都含有一個名為 **X-Lv13-Token** 的 Header,這就是我們要的 >要特別注意這關的通關 Token 是 ==十三== 關的唷,所以直接前往十三關 >[name=lamacat] :::success **# 通關 #** Token 為:<font color="#dff0d8">{qspyz}</font> ::: # 0x0D 第十三關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv13?token={qspyz} ::: :::info **# 故事 #** 太好了!自從你上次把運送用的 token 拿回來以後,我們就密切地與菲律賓在交換書籍 可是最近碰到了一些小問題,不知道為什麼有時候會傳送失敗 我跟他們反映過後,他們叫我們自己去拿 log 來看,你可以幫我去看看嗎? 從系統日誌裡面應該可以找到一些端倪 ::: :::spoiler Hint >你有聽過代理伺服器 proxy 嗎? ::: ## 解題思路 透過 [API-Ex] **獲取系統日誌**,得到了一下訊息 >此 request 不是來自菲律賓,禁止存取系統資訊。 由於我們沒辦法直接修改 request 的來源位置 這關我們需要透過 proxy 來訪問,這樣就能正常取得資訊了 >建議使用 FireFox 瀏覽器,因為 Chrome 是設定本機電腦 proxy 的方式 >[name=lamacat] :::success **# 通關 #** { logType: 'token', value: '<font color="#dff0d8">{SEOisHard}</font>' } ::: # 0x0E 第十四關 :::spoiler 關卡傳送門 https://lidemy-http-challenge.herokuapp.com/lv14?token={SEOisHard} ::: :::info **# 故事 #** 跟那邊的溝通差不多都搞定了,真是太謝謝你了,關於這方面沒什麼問題了! 不過我老大昨天給了我一個任務,他希望我去研究那邊的首頁內容到底是怎麼做的 為什麼用 Google 一搜尋關鍵字就可以排在第一頁,真是太不合理了   他們的網站明明就什麼都沒有,怎麼會排在那麼前面? 難道說他們偷偷動了一些手腳?讓 Google 搜尋引擎看到的內容跟我們看到的不一樣?   算了,還是不要瞎猜好了,你幫我們研究一下吧! ::: :::spoiler Hint >伺服器是怎麼辨識是不是 Google 搜尋引擎的?仔細想想之前我們怎麼偽裝自己是 IE6 的 ::: ## 解題思路 >讓 Google 搜尋引擎看到的內容跟我們看到的不一樣? 這句話提供很大的提示,要知道 Google 不可能手動瀏覽網站,才來更新它們的資料庫 尤其世界上,成千上萬的網站 所以,最有可能的,就是透過機器人,簡單來說就是**網路爬蟲(Web Crawler)** 那麼 Google 的爬蟲機器人,會叫什麼呢?當然是離所當然的叫 **Googlebot** 囉 我們只透過 Google 就可以找到 Googlebot 的 user-agent 然後發送一個 request 夾帶 Googlebot 的 user-agent,這題就解開囉 :::success **# 通關 #** I Love Google Google please rank our website higher, PLEASE! token for lv15:<font color="#dff0d8">{ILOVELIdemy!!!}</font> ::: :::spoiler 額外補充 這關 Request 的 Raw 格式,長這樣 ``` GET /api/v3/index HTTP/1.1 Host: lidemy-http-challenge.herokuapp.com user-agent: Googlebot/2.1 ``` ::: # 0x0F 故事結局 :::info 還真的是我猜的那樣...不過還是要謝謝你幫我們完成這麼多任務! 今天是我在這職位的最後一天啦,之後我要升官了,應該就不用處理這麼多小事情了 這段期間感謝你的幫忙,我們以後有緣再相見啦!   The End,恭喜破關! 這次是真的破關了,這是最後一關,感謝你願意參與這個遊戲 也希望這遊戲是有趣的,希望你在玩的時候有學到東西 也歡迎把這個遊戲分享給親朋好友們 感謝!   我開了一個 gist,大家可以在這邊隨意留言,或是講一下破關感言 https://gist.github.com/aszx87410/1dbde92876ba253a45654988ca829ebb   最後,感謝所有幫我測試的朋友們   Author: huli@lidemy.com https://www.facebook.com/lidemytw/ ::: 恭喜各位結束這次體驗營((X 也感謝設計這些關卡的Huli大大 XD ((完結灑花 # 0xFE 結語與總結 >甚麼時候用curl打過全15關(X >[name=羽澤] >啊啊,上面這個人,隔天就完成它的願望了,詳細過程寫在新的writeup,在最上面 >[name=lamacat] >啊就很閒咩((逃避工作 >[name=羽澤] >本writeup單純防老,完成日期[time=Thu, Apr 30, 2020 9:20 PM] >[name=lamacat] >首先還是感謝作者,提供這麼好玩的遊戲,沒有遊戲就沒有此writeup >實際解題花費的時間不長,但寫這writeup時間就不短了 >可能因為第一次寫wirteup吧,希望自己能力越來越好,能解的題目越來越多www >  >下台一鞠躬 >[name=lamacat]