[指令日記] 004 深入探討 cURL:從 HTTP 請求方法到資安應用

cURL 是一個強大且廣泛使用的指令工具,可以用來與各種網路協定(最常見的是 HTTP/HTTPS)互動。

本文將從 cURL 的基本概念、常見使用情境,到在資安領域的應用進行介紹,並且詳述 cURL 在不同參數下會使用哪些 HTTP 方法,最後說明為什麼 -I-X GET 會有不同的行為,且同時指定時又能得到 200 OK 的原因。

1. cURL 是什麼

cURL(client URL)是一個用於傳輸資料的命令列工具,可支援多種網路協定(HTTP、HTTPS、FTP、SFTP 等)。在日常開發中,我們最常用 cURL 和 HTTP/HTTPS 通訊做以下事情:
– 發送 API 請求
– 測試網站回應(Debug)
– 模擬表單送出
– 上傳檔案

它的優勢在於操作簡單且跨平台,並且能客製化幾乎所有 HTTP 標頭與傳輸細節,因此對於開發者和資安人員都是不可或缺的工具。


2. 什麼時候用到 cURL

以下情境常會讓我們想到使用 cURL:
1. 快速測試 API 接口: 用於檢查 HTTP 狀態碼、回傳資料結構是否符合預期。
2. 批次監控網站: 結合腳本或 cron job,用於定時檢查服務是否正常執行。
3. 模擬不同請求方法: GETPOSTPUTDELETE 等,以驗證 API 的各種行為。
4. 下載或上傳檔案: 以 FTP、HTTP 等方式傳輸檔案。
5. 資安測試與滲透: 檢查網站對於特殊請求是否有安全漏洞,例如 TRACEOPTIONS


3. 為什麼學資安需要學 cURL

在資安領域,cURL 不只是「下載檔案的工具」,更是一種直接與伺服器互動的方式。舉例來說:
測試網站是否對某些 HTTP 方法(如 HEADDELETE)開放: 若不小心設定錯誤,駭客可能利用 DELETE 直接刪除關鍵資源。
檢查 API 或網站回應標頭(Header): 從標頭中可得知伺服器版本、是否有開啟安全機制(如 HSTS)等資訊。
模擬異常或邊緣請求: 利用 -d-F-X 指定方法,測試伺服器對於特殊參數的容忍度,找出潛在漏洞。

因此,熟練掌握 cURL 不僅能提升日常開發效率,更能幫助資安人員有效挖掘與評估系統弱點。


4. 預設情況的參數用什麼請求方法

當你使用 curl沒有加任何參數 時,它預設會使用 GET 方法。但是,根據你加的某些參數,curl 會自動切換到其他 HTTP 方法(如 POSTHEAD 等)。以下是一些常見的範例:

4.1 沒有加任何參數:默認使用 GET

curl https://example.com

行為:
– 預設使用 GET 方法。
– 只會請求資源的內容。


4.2 -I:自動切換到 HEAD 方法

curl -I https://example.com

行為:
– 自動切換到 HEAD 方法。
– 只請求資源的 HTTP 標頭,不返回內容。


4.3 -d--data:自動切換到 POST 方法

curl -d "name=Phoebe&age=18" https://example.com

行為:
– 自動切換到 POST 方法。
– 將資料 (name=Phoebe&age=18) 作為表單發送到伺服器。


4.4 -X POST:強制使用 POST 方法

curl -X POST https://example.com

行為:
– 使用 POST 方法,但不會自動帶有 Content-Type 或資料。
– 與 -d 不同,此請求沒有附加任何表單資料。


4.5 -X PUT-X DELETE:自訂方法

curl -X PUT -d "name=Phoebe" https://example.com
curl -X DELETE https://example.com/resource/123

行為:
PUT:用於更新或創建資源(需伺服器支援)。
DELETE:用於刪除資源。


4.6 --upload-file-T:自動切換到 PUT 方法

curl --upload-file ./example.txt https://example.com/upload
curl -T ./example.txt https://example.com/upload

行為:
– 自動切換到 PUT 方法。
– 上傳本地文件到伺服器。


4.7 -F--form:自動切換到 POST 並使用多部分表單

curl -F "[email protected]" -F "name=Phoebe" https://example.com/upload

行為:
– 自動切換到 POST 方法。
– 將資料作為多部分表單發送。


4.8 -X OPTIONS:手動指定 OPTIONS 方法

curl -X OPTIONS https://example.com

行為:
– 使用 OPTIONS 方法檢查伺服器支持的 HTTP 方法。
– 回應通常包含 Allow 標頭,列出支援的方法。


4.9 -X TRACE:手動指定 TRACE 方法

curl -X TRACE https://example.com

行為:
– 使用 TRACE 方法回顯伺服器收到的請求。
– 不常用,且某些伺服器可能禁用此方法。


總結:常見參數與自動/手動使用的方法

加的參數 自動使用的方法 說明
無參數 GET 預設方法,用於取得資源
-I HEAD 取得標頭資訊
-d--data POST 發送表單
-T--upload-file PUT 上傳文件
-F--form POST 發送多部分表單
-X POST POST 強制使用 POST,但無自動表單數據
-X DELETE DELETE 手動指定 DELETE 方法
-X OPTIONS OPTIONS 手動指定 OPTIONS 方法
-X TRACE TRACE 手動指定 TRACE 方法

5. 情境:為什麼 -I 會跟 -X GET 有不同的行為,以及為何同時指定 -I-X GET 時還能顯示 200

5.1 -I 預設使用 HEAD 方法

  • -I 原本設計就是要「只抓取網頁標頭」的功能。
  • 伺服器若 不允許 HEAD,就可能回傳 405 Method Not Allowed

5.2 指定 -X GET 時的行為

  • 明確指定 -X GET 則會改為使用 GET 請求。
  • 多數伺服器對 GET 都是允許的,所以就會回傳 200 OK

5.3 同時指定 -I-X GET 時會怎麼樣?

  • 優先順序上,-X GET 會強制請求方法為 GET
  • 但是,因為加了 -I,所以最後依舊「只顯示標頭」。
  • 伺服器收到的請求其實是 GET,並且回傳 200;只是 cURL 不會顯示 Body(因為 -I 的使用目的就是只想要看 Header)。

這種「表面看來像是 HEAD 請求,實際卻是 GET 請求」的矛盾,是因為 cURL 在「請求方法」與「輸出顯示」上各自分開做了控制,因此只顯示標頭並不代表它真的發送了 HEAD 請求,而是因為我們手動把方法改成 GET,同時又使用了 -I 來隱藏回傳內容。


總結

cURL 在資安領域和開發測試中都很重要。它預設使用 GET,但根據不同參數可能自動或手動切換到其他 HTTP 方法。像 -I 這樣的參數通常會使用 HEAD,導致部分伺服器回傳 405。若我們同時指定 -I-X GET,雖然最終方法會被強制為 GET,卻只顯示標頭而不顯示內容,從而形成表面上「HEAD + GET」的效果。

瞭解這些行為邏輯,有助於我們在進行 API 測試與資安檢測時能精準控制並解讀伺服器回應,並從中挖掘潛在漏洞或配置問題。希望透過本文,讀者能對 cURL 及其在資安上的應用有更深一層的認識!

飛飛
飛飛