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. 模擬不同請求方法: GET
、POST
、PUT
、DELETE
等,以驗證 API 的各種行為。
4. 下載或上傳檔案: 以 FTP、HTTP 等方式傳輸檔案。
5. 資安測試與滲透: 檢查網站對於特殊請求是否有安全漏洞,例如 TRACE
、OPTIONS
。
3. 為什麼學資安需要學 cURL
在資安領域,cURL 不只是「下載檔案的工具」,更是一種直接與伺服器互動的方式。舉例來說:
– 測試網站是否對某些 HTTP 方法(如 HEAD
、DELETE
)開放: 若不小心設定錯誤,駭客可能利用 DELETE 直接刪除關鍵資源。
– 檢查 API 或網站回應標頭(Header): 從標頭中可得知伺服器版本、是否有開啟安全機制(如 HSTS)等資訊。
– 模擬異常或邊緣請求: 利用 -d
、-F
或 -X
指定方法,測試伺服器對於特殊參數的容忍度,找出潛在漏洞。
因此,熟練掌握 cURL 不僅能提升日常開發效率,更能幫助資安人員有效挖掘與評估系統弱點。
4. 預設情況的參數用什麼請求方法
當你使用 curl
而 沒有加任何參數 時,它預設會使用 GET
方法。但是,根據你加的某些參數,curl
會自動切換到其他 HTTP 方法(如 POST
、HEAD
等)。以下是一些常見的範例:
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 及其在資安上的應用有更深一層的認識!