mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
190 lines
12 KiB
Markdown
190 lines
12 KiB
Markdown
# 特殊な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-unit>`
|
||
- **`Range`**: サーバーが返すべきドキュメントの部分を示します。例えば、`Range:80-100`は、元の応答のバイト80から100を206 Partial Contentのステータスコードで返します。また、リクエストから`Accept-Encoding`ヘッダーを削除することを忘れないでください。
|
||
- これは、そうでなければエスケープされる可能性のある任意の反射されたJavaScriptコードを含む応答を取得するのに役立つかもしれません。しかし、これを悪用するには、リクエストにこのヘッダーを挿入する必要があります。
|
||
- **`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) <a href="#csp" id="csp"></a>
|
||
|
||
{{#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, '<').replace(/>/g, '>');
|
||
});
|
||
}
|
||
```
|
||
|
||
```javascript
|
||
// Assignment of raw strings is blocked, ensuring safety.
|
||
el.innerHTML = "some string" // Throws an exception.
|
||
const escaped = policy.createHTML("<img src=x onerror=alert(1)>")
|
||
el.innerHTML = escaped // Results in safe assignment.
|
||
```
|
||
### **X-Content-Type-Options**
|
||
|
||
このヘッダーは、XSS脆弱性につながる可能性のあるMIMEタイプスニッフィングを防ぎます。これは、ブラウザがサーバーによって指定されたMIMEタイプを尊重することを保証します。
|
||
```
|
||
X-Content-Type-Options: nosniff
|
||
```
|
||
### **X-Frame-Options**
|
||
|
||
クリックジャッキングに対抗するために、このヘッダーはドキュメントが`<frame>`、`<iframe>`、`<embed>`、または`<object>`タグにどのように埋め込まれるかを制限し、すべてのドキュメントがその埋め込み許可を明示的に指定することを推奨します。
|
||
```
|
||
X-Frame-Options: DENY
|
||
```
|
||
### **Cross-Origin Resource Policy (CORP) と Cross-Origin Resource Sharing (CORS)**
|
||
|
||
CORPは、どのリソースがウェブサイトによって読み込まれるかを指定するために重要であり、クロスサイトの漏洩を軽減します。一方、CORSは、特定の条件下で同一オリジンポリシーを緩和し、より柔軟なクロスオリジンリソース共有メカニズムを可能にします。
|
||
```
|
||
Cross-Origin-Resource-Policy: same-origin
|
||
Access-Control-Allow-Origin: https://example.com
|
||
Access-Control-Allow-Credentials: true
|
||
```
|
||
### **Cross-Origin Embedder Policy (COEP) と Cross-Origin Opener Policy (COOP)**
|
||
|
||
COEP と COOP は、クロスオリジンの隔離を有効にするために不可欠であり、Spectre のような攻撃のリスクを大幅に低減します。これらは、それぞれクロスオリジンリソースの読み込みとクロスオリジンウィンドウとの相互作用を制御します。
|
||
```
|
||
Cross-Origin-Embedder-Policy: require-corp
|
||
Cross-Origin-Opener-Policy: same-origin-allow-popups
|
||
```
|
||
### **HTTP Strict Transport Security (HSTS)**
|
||
|
||
最後に、HSTSはブラウザがサーバーと安全なHTTPS接続のみで通信することを強制するセキュリティ機能であり、プライバシーとセキュリティを向上させます。
|
||
```
|
||
Strict-Transport-Security: max-age=3153600
|
||
```
|
||
## 参考文献
|
||
|
||
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
|
||
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
|
||
- [https://web.dev/security-headers/](https://web.dev/security-headers/)
|
||
- [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|