---
# System prepended metadata

title: "HTTP GAME：Lidemy HTTP Challenge\n進階實戰 writeup  --- curl版"
tags: [CTF]

---

---
lang: zh-tw
tags: CTF
---

HTTP GAME：Lidemy HTTP Challenge
進階實戰 writeup  --- curl版
===

遊戲網址：https://lidemy-http-challenge.herokuapp.com
普通版 writeup：https://hackmd.io/2xI__kA_TO69EHuPm63uFQ

# 0xFF 前言
在上一篇 writeup 最下面，說過要用 curl 打通全 15 關，所以來還願了XD
剛好也可以來做 curl 的應用練習

推薦是先通過普通通關方式再來嘗試此篇教學，不然就是先去看看普通版的writeup，因為那邊比較仔細解釋是如何運作的。

>人就是各種作死
>[name=羽澤]

# 0xFE curl簡介
curl 是 Linux上用來瀏覽、上傳、下載透過 HTTP 傳遞的資料的工具，可以做的事情很多，有興趣可上網爬文，下面提供本次實作用到的網站。

[使用 curl 指令測試 REST 服務](https://www.iteye.com/blog/usench-2268844)
[curl 指令基本介紹與常見用法](https://blog.techbridge.cc/2019/02/01/linux-curl-command-tutorial/)
[Linux curl命令使用代理、以及代理種類介绍](https://aiezu.com/article/linux_curl_proxy_http_socks.html)
[linux下的curl命令](https://www.itread01.com/content/1548503847.html)

提供一下懶得爬文的朋友們在本篇會用到的參數簡介
```bash
-X <Method>     GET                  == 透過<Method>傳送 ==
                POST    
                DELETE   
                PATCH  
   
-d "<data:value>"                    == 傳送資料，多筆資料請用&分隔 == 
   
-x <ip:port> or --proxy <ip:port>    == 透過指定proxy傳送 ==

-H "<Header>"                        == 設定Header的值 ==

--user-agent "<user-agent>"          == 設定user-agent ==

-i                                   == 顯示網頁標頭和Html碼 ==
```
>在Linux中，參數的大小寫有不一樣的功能，要注意
>[name=羽澤]
# 0x00 故事開頭

### 解題思路
謝謝各位，還沒開始就遇到問題QQ
因為 curl 沒辦法解析 token 的大括號，所以為了解決弄了一段時間
問了 Google 之後，發現只要把**大括號{ } url encode** 即可

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv1?token=%7BGOGOGO%7D"
```

>感謝萬能的 Markdown，害我一直貼上超連結
>[name=羽澤]

# 0x01 第一關

### 解題思路
第二關叫我們把 name 參數帶上，跟普通版瀏覽方式一樣，所以很快就通過了。

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv1?token=%7BGOGOGO%7D&name=Yusawa"
```

# 0x02 第二關
想想還是把進入關卡的指令附一下好了

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv2?token=%7BHellOWOrld%7D"
```
### 解題思路
這題是要你找書的 id，所以跟上一題一樣方式傳值就好，但是要記得把 name 改成 id

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv2?token=%7BHellOWOrld%7D&id=56"
```

# 0x03 第三關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv3?token=%7B5566NO1%7D"
```

### 解題思路
這關就要用到 POST 還有他附的 [API](https://gist.github.com/aszx87410/3873b3d9cbb28cb6fcbb85bf493b63ba) 了
我們可以透過參數 `-X` 來指定 HTTP Method，這裡我們把 Method 指定為 POST
然後透過參數 `-d "data1=value1&data2=value2"` 來傳我們要 POST 過去的資料

```bash
指令：
curl -X POST -d "name=大腦喜歡這樣學&ISBN=9789863594475" "https://lidemy-http-challenge.herokuapp.com/api/books"
```



這樣就可以獲得書的id了，回傳給網頁領取下一關的token。

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv3?token=%7B5566NO1%7D&id=1989"
```

# 0x04 第四關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv4?token=%7BLEarnHOWtoLeArn%7D"
```

### 解題思路
這一關他說幫他找書名有"**世界**"，並且是++村上春樹++的書，所以我們一樣透過 API 的指示 GET 他所有的書籍，但是如果直接搜尋"世界"的話，curl 會無法轉碼，所以一定要 [URL encode](https://www.urlencoder.org/)，encode 後即可查詢成功。

```bash
指令：
curl https://lidemy-http-challenge.herokuapp.com/api/books?q=%E4%B8%96%E7%95%8C
```

>真的會被自己蠢死，明明 **大括弧{ }** 就要encode了，我怎麼認為中文不用呢？
>[name=羽澤]


獲得資料後，就可以把 id 回傳給網頁了。

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv4?token=%7BLEarnHOWtoLeArn%7D&id=79"
```

# 0x05 第五關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv5?token=%7BHarukiMurakami%7D"
```

### 解題思路
這題他要求的是刪除資料，我們一樣透過 API 來得知他用 **DELETE** 的 Method 來刪除資料，所以我們用 `-X DELETE` 來達成他的要求。

```bash
指令：
curl -X DELETE https://lidemy-http-challenge.herokuapp.com/api/books/23
```

然後就可以獲得token了

>有人問說為什麼有時候網址會加""，有時候不會
>傻孩子，就是怕他會誤判R
>[name=羽澤]
# 0x06 第六關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv6?token=%7BCHICKENCUTLET%7D"
```

### 解題思路
這邊開始就要使用新的 [API](https://gist.github.com/aszx87410/1e5e5105c1c35197f55c485a88b0328a) 了，他要求說你要嘗試登入並給他 email，但是帳號密碼的傳遞是要透過 Header 的，所以要準備 [base64 encode](https://www.base64encode.org/) 過後的帳號密碼，之後照著 API 給的提示
Header的表示會變為**Authorization: Basic YWRtaW46YWRtaW4xMjM=**

之後使用 `-H "Header Data"` 參數來傳遞改好的 Header 即可

```bash
指令：
curl -H "Authorization: Basic YWRtaW46YWRtaW4xMjM=" https://lidemy-http-challenge.herokuapp.com/api/v2/me
```

獲得 email 之後，一樣回傳給伺服器即可獲得 token。

```bash
指令:
curl "https://lidemy-http-challenge.herokuapp.com/lv6?token=%7BCHICKENCUTLET%7D&email=lib@lidemy.com"
```

# 0x07 第七關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv7?token=%7BSECurityIsImPORTant%7D"
```

### 解題思路
這關一樣是要求刪除書籍，所以一樣是帶 `-X DELETE` 的參數，但是不一樣的是這次是要攜帶帳號密碼 Header 的。

```bash
指令：
curl -X DELETE -H "Authorization: Basic YWRtaW46YWRtaW4xMjM="  https://lidemy-http-challenge.herokuapp.com/api/v2/books/89
```

這樣就可以獲得token進入下一關了。

# 0x08 第八關

```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv8?token=%7BHsifnAerok%7D"
```

### 解題思路
這關是要求修改書籍 ISBN，但是他說他只記得書名只有一個"**我**"，結尾是 7，要修正成 3。
所以我們一樣透過 [URL encode](https://www.urlencoder.org/) 去把"**我**"給轉成URL編碼，這樣就可以去查書名了


```bash
指令:
curl -H "Authorization: Basic YWRtaW46YWRtaW4xMjM=" https://lidemy-http-challenge.herokuapp.com/api/v2/books?q=%E6%88%91
```


可以看到回傳符合的資料，就可以透過API提供的Method PATCH去修改，所以我們使用 `-X PATCH -d "name=data&ISBN=value"`去修改他的資料。

```bash
指令：
curl -X PATCH -d"name=日日好日：茶道教我的幸福15味【電影書腰版】&ISBN=9981835423" -H "Authorization: Basic YWRtaW46YWRtaW4xMjM="  https://lidemy-http-challenge.herokuapp.com/api/v2/books/72
```

就可獲得下一關token

# 0x09 第九關
```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv9?token=%7BNeuN%7D"
```

### 解題思路
這一關是要拿取API裡面的回傳值，題目內有提到Header內要攜帶X-Library-Number:20的參數，跟[IE6的user-agent](https://developers.whatismybrowser.com/useragents/parse/2045-internet-explorer-windows-trident)，所以我們利用參數` --user-agent "agent" `跟 `-H "X-Library-Number:20"`來傳遞題目要求的值。

```bash
指令：
curl --user-agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" -H "X-Library-Number:20" -H "Authorization: Basic YWRtaW46YWRtaW4xMjM="  https://lidemy-http-challenge.herokuapp.com/api/v2/sys_info
```

>Header好像不能用&分隔兩個參數，所以多下了個 -H
>[name=羽澤]

之後就可以看到他傳回來的資料了，把version填上後回傳給伺服器即可過關。

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv9?token=%7BNeuN%7D&version=1A4938Jl7"
```

# 0x0A 第十關
```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv10?token=%7BduZDsG3tvoA%7D"
```

### 解題思路
基礎篇最後一關了w，就是猜數字，猜法我都寫在[普通版](https://hackmd.io/2xI__kA_TO69EHuPm63uFQ)裡面了，自己去找吧((喂

```bash
通關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv10?token=%7BduZDsG3tvoA%7D&num=9613"
```

Extra Stage
===
又到了Extra的環節了，再四關，加油ww

# 0x0B 第十一關
```bash
進關指令:
curl "https://lidemy-http-challenge.herokuapp.com/lv11?token=%7BIhateCORS%7D"
```

### 解題思路
又換了新的[API](https://gist.github.com/aszx87410/0b0d3cabf32c4e44084fadf5180d0cf4)，他說先去打個招呼，但是API會限制些東西，先不管，連進去看看再說

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/api/v3/hello"
```

他會說origin不被允許此資源，請透過 <span>lidemy.com</span> 送出 request，所以我們透過` -H "Header" `加入`origin:lidemy.com`的參數。

```bash
指令：
curl -H "origin:lidemy.com" "https://lidemy-http-challenge.herokuapp.com/api/v3/hello"
```

就可以獲得下一關的token了

# 0x0C 第十二關
```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv12?token=%7Br3d1r3c7%7D"
```

### 解題思路
這關他說替他拿取運送用的token，所以透過API提示，我們連去獲取token的網頁，但是他是跳轉的網頁，如果直連他只會說跳轉往其他網址，所以要加個 -i 來讀他的隱藏標頭與原始碼。

```bash
指令:
curl -i "https://lidemy-http-challenge.herokuapp.com/api/v3/deliver_token"
```

之後即可在標頭內看到token。

# 0x0D 第十三關
```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv13?token=%7Bqspyz%7D"
```

### 解題思路
這關他說要自己去尋找菲律賓主機的log，所以我們就透過API提示的連過去。

```bash
指令：
curl "https://lidemy-http-challenge.herokuapp.com/api/v3/logs"
```

但是傳送過去說非菲律賓地區的連線，所以我們要透過跳proxy的方式連到那個網站，於是使用
`--proxy ip:port` 去跳到[菲律賓的proxy](https://www.proxydocker.com/zh/proxylist/country/Philippines)瀏覽

```bash
指令：
curl --proxy 122.55.250.242:8080 https://lidemy-http-challenge.herokuapp.com/api/v3/logs
```

>試了超多個proxy才找到一個能用的，不要把已經過期的放在網路上啊！
>[name=羽澤]

之後就能拿到token了。

# 0x0E 第十四關
```bash
進關指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv14?token=%7BSEOisHard%7D"
```

### 解題思路
這次是真的最後一關了ww，他要求說可以讓Google一搜關鍵字就找到網站，所以我們透過改user-agent的方式，來讓[google bot](https://support.google.com/webmasters/answer/1061943?hl=zh-Hant)抓取，讓網頁得以出現在搜尋榜上。

```bash
指令：
curl --user-agent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "https://lidemy-http-challenge.herokuapp.com/api/v3/index"
```

之後就成功獲得結局token了。

# 0x0F 故事結尾
```bash
結局指令：
curl "https://lidemy-http-challenge.herokuapp.com/lv15?token=%7BILOVELIdemy%21%21%21%7D"
```
>到結尾還不忘用URL encode搞你一下幹
>[name=羽澤]

好了，我還願結束了www
這也是個練習curl的好機會，順便紀錄一下防老防失憶ww

我們下個writeup見了，掰掰