---
# System prepended metadata

title: HTTP GAME：Lidemy HTTP Challenge 實戰 writeup
tags: [CTF]

---

---
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]