# XSS、CSP、およびSOPにおけるiframes
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**してみたいですか?または**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を手に入れましょう
* **[💬](https://emojipedia.org/speech-balloon/) [Discordグループ](https://discord.gg/hRep4RUj7f)に参加するか、[telegramグループ](https://t.me/peass)に参加するか、または**Twitter**で**私をフォロー**してください 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)および[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出して、あなたのハッキングトリックを共有してください。
## XSSにおけるiframes
iframedページのコンテンツを示す方法は3つあります:
* `src`を使用してURLを示す(URLはクロスオリジンまたは同一オリジンである可能性があります)
* `data:`プロトコルを使用してコンテンツを示す`src`を使用して
* コンテンツを示す`srcdoc`を使用して
```html
```
```html
```
前のhtmlにhttpサーバー経由でアクセスすると(`python3 -m http.server`のように)、すべてのスクリプトが実行されることに気づくでしょう(CSPがそれを防いでいないため)。**親は任意のiframe内の`secret`変数にアクセスできない**ことに注意し、**元のウィンドウ内の秘密にアクセスできるのはif2とif3のみ(同一サイトと見なされる)**です。\
if4が`null`オリジンであると見なされることにも注目してください。
### CSPを使用したiframes
{% hint style="info" %}
次のバイパスで、iframedページへの応答にJS実行を防ぐCSPヘッダーが含まれていないことに注意してください。
{% endhint %}
`script-src`の`self`値は、`data:`プロトコルや`srcdoc`属性を使用したJSコードの実行を許可しません。\
ただし、CSPの`none`値でも、`src`属性にURL(完全なものまたはパスのみ)を設定するiframeの実行を許可します。\
したがって、ページのCSPをバイパスすることが可能です。
```html
```
前のCSPは、**インラインスクリプトの実行のみを許可している**ことに注意してください。\
ただし、**`if1`と`if2`スクリプトのみが実行され、`if1`のみが親の秘密にアクセスできる**ようになります。
![](<../../.gitbook/assets/image (627) (1) (1).png>)
したがって、**サーバーにJSファイルをアップロードし、`script-src 'none'`であってもiframe経由でロードすることができれば、CSPをバイパスすることが可能**です。これは、**同一サイトのJSONPエンドポイントを悪用して行うことも可能**です。
次のシナリオでこれをテストできます。`script-src 'none'`であっても、クッキーが盗まれる可能性があります。アプリケーションを実行し、ブラウザでアクセスしてください:
```python
import flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
resp = flask.Response('')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp
@app.route("/cookie_s.html")
def cookie_s():
return ""
if __name__ == "__main__":
app.run()
```
### 野生で見つかった他のペイロード
```html
```
### Iframe sandbox
`sandbox`属性を使用することで、iframe内のコンテンツに追加の制限を設けることができます。デフォルトでは、この属性は適用されず、制限はありません。
`sandbox`属性を使用すると、いくつかの制限が課せられます:
- コンテンツは一意のソースから発信されたものとして扱われます。
- フォームの送信試行がブロックされます。
- スクリプトの実行が禁止されます。
- 特定のAPIへのアクセスが無効になります。
- リンクが他のブラウジングコンテキストとやり取りするのを防ぎます。
- `