# 特殊なHTTPヘッダー {{#include ../../banners/hacktricks-training.md}} ## ワードリストとツール - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) ## 変更するヘッダーの場所 **IPソース**の書き換え: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` - `X-Forwarded: 127.0.0.1` - `Forwarded-For: 127.0.0.1` - `X-Forwarded-Host: 127.0.0.1` - `X-Remote-IP: 127.0.0.1` - `X-Remote-Addr: 127.0.0.1` - `X-ProxyUser-Ip: 127.0.0.1` - `X-Original-URL: 127.0.0.1` - `Client-IP: 127.0.0.1` - `X-Client-IP: 127.0.0.1` - `X-Host: 127.0.0.1` - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` - `Connection: close, X-Forwarded-For` (ホップバイホップヘッダーを確認) **場所**の書き換え: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` ## ホップバイホップヘッダー ホップバイホップヘッダーは、リクエストを処理しているプロキシによって処理され、消費されることを目的としたヘッダーであり、エンドツーエンドヘッダーとは対照的です。 - `Connection: close, X-Forwarded-For` {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} ## HTTPリクエストスムージング - `Content-Length: 30` - `Transfer-Encoding: chunked` {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} ## キャッシュヘッダー **サーバーキャッシュヘッダー**: - **`X-Cache`**は、リクエストがキャッシュされていない場合は**`miss`**、キャッシュされている場合は**`hit`**の値を持つことがあります。 - ヘッダー**`Cf-Cache-Status`**でも同様の動作があります。 - **`Cache-Control`**は、リソースがキャッシュされているかどうか、次回キャッシュされる時期を示します: `Cache-Control: public, max-age=1800` - **`Vary`**は、通常はキーがないヘッダーであっても、キャッシュキーの一部として扱われる**追加ヘッダー**を示すために、レスポンスでよく使用されます。 - **`Age`**は、オブジェクトがプロキシキャッシュに存在している秒数を定義します。 - **`Server-Timing: cdn-cache; desc=HIT`**は、リソースがキャッシュされていたことも示します。 {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} **ローカルキャッシュヘッダー**: - `Clear-Site-Data`: 削除すべきキャッシュを示すヘッダー: `Clear-Site-Data: "cache", "cookies"` - `Expires`: レスポンスが期限切れになる日時を含む: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache`は`Cache-Control: no-cache`と同じです。 - `Warning`: **`Warning`**一般HTTPヘッダーは、メッセージの状態に関する問題の可能性についての情報を含みます。レスポンスに複数の`Warning`ヘッダーが表示されることがあります。`Warning: 110 anderson/1.3.37 "Response is stale"` ## 条件付きリクエスト - これらのヘッダーを使用するリクエスト: **`If-Modified-Since`**および**`If-Unmodified-Since`**は、レスポンスヘッダー\*\*`Last-Modified`\*\*が異なる時間を含む場合にのみデータで応答されます。 - **`If-Match`**および**`If-None-Match`**を使用する条件付きリクエストは、Etag値を使用し、データ(Etag)が変更された場合にウェブサーバーがレスポンスの内容を送信します。`Etag`はHTTPレスポンスから取得されます。 - **Etag**値は通常、レスポンスの**内容**に基づいて**計算**されます。例えば、`ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"`は、`Etag`が**37バイト**の**Sha1**であることを示しています。 ## レンジリクエスト - **`Accept-Ranges`**: サーバーがレンジリクエストをサポートしているかどうか、サポートしている場合はどの単位でレンジを表現できるかを示します。`Accept-Ranges: ` - **`Range`**: サーバーが返すべきドキュメントの部分を示します。 - **`If-Range`**: 指定されたetagまたは日付がリモートリソースと一致する場合にのみ満たされる条件付きレンジリクエストを作成します。リソースの互換性のないバージョンから2つのレンジをダウンロードするのを防ぐために使用されます。 - **`Content-Range`**: 完全なボディメッセージのどこに部分メッセージが属するかを示します。 ## メッセージボディ情報 - **`Content-Length`:** リソースのサイズ(バイト数の10進数)。 - **`Content-Type`**: リソースのメディアタイプを示します。 - **`Content-Encoding`**: 圧縮アルゴリズムを指定するために使用されます。 - **`Content-Language`**: 対象となる人間の言語を説明し、ユーザーが自分の好みの言語に応じて区別できるようにします。 - **`Content-Location`**: 返されたデータの代替位置を示します。 ペンテストの観点から、この情報は通常「無駄」です。しかし、リソースが**401**または**403**で**保護されている**場合、これを**取得する方法**を見つけることができれば、これは**興味深い**かもしれません。\ 例えば、HEADリクエストでの**`Range`**と**`Etag`**の組み合わせは、HEADリクエストを介してページの内容を漏洩させることができます: - ヘッダー`Range: bytes=20-20`を持つリクエストと、`ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`を含むレスポンスは、バイト20のSHA1が`ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`であることを漏洩しています。 ## サーバー情報 - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` ## コントロール - **`Allow`**: このヘッダーは、リソースが処理できるHTTPメソッドを伝えるために使用されます。例えば、`Allow: GET, POST, HEAD`と指定されている場合、リソースがこれらのメソッドをサポートしていることを示します。 - **`Expect`**: クライアントがリクエストを正常に処理するためにサーバーが満たす必要がある期待を伝えるために使用されます。一般的な使用例は、クライアントが大きなデータペイロードを送信する意図を示す`Expect: 100-continue`ヘッダーです。クライアントは、送信を進める前に`100 (Continue)`レスポンスを探します。このメカニズムは、サーバーの確認を待つことでネットワークの使用を最適化するのに役立ちます。 ## ダウンロード - HTTPレスポンスの**`Content-Disposition`**ヘッダーは、ファイルを**インライン**(ウェブページ内)で表示するか、**添付ファイル**(ダウンロード)として扱うかを指示します。例えば: ``` Content-Disposition: attachment; filename="filename.jpg" ``` これは「filename.jpg」という名前のファイルがダウンロードされて保存されることを意図していることを意味します。 ## セキュリティヘッダー ### コンテンツセキュリティポリシー (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} ### **信頼されたタイプ** CSPを通じて信頼されたタイプを強制することで、アプリケーションはDOM XSS攻撃から保護されます。信頼されたタイプは、確立されたセキュリティポリシーに準拠した特別に作成されたオブジェクトのみが危険なWeb API呼び出しに使用できることを保証し、デフォルトでJavaScriptコードを保護します。 ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => str.replace(/\/g, '>'); }); } ``` ```javascript // Assignment of raw strings is blocked, ensuring safety. el.innerHTML = "some string" // Throws an exception. const escaped = policy.createHTML("") el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** このヘッダーはMIMEタイプのスニッフィングを防ぎます。これはXSS脆弱性につながる可能性があります。サーバーによって指定されたMIMEタイプをブラウザが尊重することを保証します。 ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** クリックジャッキングに対抗するために、このヘッダーはドキュメントが``、`