Hello there, ('ω')ノ
🎯 1. Clickjackingとは?
Clickjacking(クリックジャッキング)とは、攻撃者が透明または偽装されたUIを使い、 ユーザに本来意図していないボタンやリンクをクリックさせる攻撃です。
例: 見た目は「再生ボタン」に見えるが、背後で「アカウント削除ボタン」が押される
🎭 2. どうやって成立するのか?
攻撃者のWebサイトに、対象サイトのページを<iframe>
で読み込み、
その上に透明なレイヤーを重ねてユーザのクリックを誘導する。
<iframe src="https://target-site.com/delete" style="opacity:0; position:absolute; top:0; left:0; width:100%; height:100%"></iframe>
🧭 3. 診断対象となるページ・操作
ページ / 操作 | 内容 |
---|---|
🔧 アカウント設定変更画面 | メール変更、退会、削除など |
💰 購入・決済ボタン | ワンクリック決済や注文確定 |
⚙️ 管理画面の操作 | 権限昇格、ユーザ削除など |
✅ CSRF保護されていない機能 | 実行が容易になる |
🛠️ 4. 診断方法(手順)
- 対象サイトの重要操作ページ(例:
/delete
,/setting/update
)を特定 <iframe>
で読み込めるか確認- 攻撃用HTMLページを作成し、iframeに対象ページを埋め込み
- iframe上に透明ボタンを設置してユーザにクリックさせる
- 実際にクリックで処理が実行されたら脆弱性あり
🧪 5. テスト用HTMLコード例
<!-- clickjacking_test.html --> <!DOCTYPE html> <html> <head> <title>攻撃ページ</title> </head> <body> <h1>ここをクリックしてスタート!</h1> <iframe src="https://target-site.com/account/delete" style="position:absolute; top:0; left:0; width:500px; height:300px; opacity:0; z-index:10;"></iframe> <button style="position:absolute; top:100px; left:100px; z-index:20;"> 🎯 ここをクリック! </button> </body> </html>
→ このページをログイン済みユーザが開いてボタンをクリックすると、背後のiframeの操作が実行される
🔐 6. サーバ側での防御策(診断時の確認ポイント)
対策 | 内容 |
---|---|
X-Frame-Options ヘッダ |
DENY または SAMEORIGIN が設定されているか |
Content-Security-Policy (CSP) |
frame-ancestors 'none'; を使用しているか |
JavaScript対策 | framebuster スクリプト(ただしバイパス可能) |
ワンタイムトークン付きの操作 | CSRFや二段階確認を併用しているか |
✅ 7. テスト時の成功/失敗のサイン
結果 | 解釈 |
---|---|
iframeでページが表示されない | X-Frame-Options により保護されている → ✅安全 |
iframeが表示される & 操作ができる | クリックジャッキングの影響を受ける → ❌脆弱性あり |
iframeは表示されるが操作が無効 | JSでframe bustingがある可能性(限定的な防御) |
🧰 8. 補助ツール・方法
- Burp Suite →
Clickbandit
拡張(clickjackingテスト用PoC作成) - 開発者ツール(F12) → iframe挿入時のヘッダ確認
- curl -I → HTTPレスポンスヘッダで
X-Frame-Options
を確認:
curl -I https://target-site.com/account/delete
⚠️ 9. 注意点・ベストプラクティス
項目 | 解説 |
---|---|
重要な操作は iframe 表示不可にする | X-Frame-Options: DENY が有効 |
CSP: frame-ancestors 'none' は最強クラス |
ほぼすべてのiframe読み込みを禁止 |
JavaScriptによる検知は過信しない | 一時しのぎの対策に過ぎない |
CSRF対策と併用する | ワンクリックで何かが実行される構造自体が危険 |
📌 見つけやすいヒント
- URLに
/delete
,/update
,/admin
,/purchase
などの副作用があるパス - ヘッダに
X-Frame-Options
やContent-Security-Policy
がない - iframeで読み込めて、さらに内部操作がトークンなしで実行できる
Best regards, (^^ゞ