hunt-clickjacking について
Webページのクリックジャッキングリスクを調べるセキュリティスキルです。保護ヘッダーの欠如だけで脆弱性とせず、実ブラウザー上でクロスサイトのフレーム内から機密操作が成立することを確認します。
主な機能
- 01X-Frame-OptionsとCSPのフレーム指令を確認
- 02実ブラウザーでフレーム表示を検証
- 03認証状態でのクロスサイト操作を確認
- 04読み取り専用ページと誤検知を除外
活用シーン
- 01送金・決済ページの評価
- 02アカウントや管理者操作の確認
- 03OAuth認可ダイアログの検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill hunt-clickjackingインストール後、Claude Code で/hunt-clickjackingを入力して読み込まれたか確認します。
詳細
クリックジャッキングとは
クリックジャッキング(UI リダressing)では、攻撃者が悪意のあるサイト上の透明な iframe に対象ページを読み込ませます。被害者には攻撃者が用意した偽の UI が見えますが、その下に隠された対象 UI をクリックしてしまいます。対象ページ側で JavaScript を実行する必要はありません。
特に価値の高い標的:
- ログイン/認証ページ — 攻撃者の認証情報でログインさせる
- 送金/チェックアウト/「支払いを確定」ボタン
- アカウント設定(メールアドレスの変更、パスワードの変更、2FA の無効化)
- OAuth/ソーシャルログインの「アプリを承認」確認ダイアログ
- 管理者操作(削除、ユーザーの昇格、ロールの変更)
保護ヘッダー
フレームへの埋め込みを防ぐ仕組みは 2 つあります。
X-Frame-Options: DENY # strongest — blocks all framing
X-Frame-Options: SAMEORIGIN # allows same-origin frames only
Content-Security-Policy: frame-ancestors 'none' # CSP equivalent of DENY
Content-Security-Policy: frame-ancestors 'self' # CSP equivalent of SAMEORIGIN
どちらも存在しない場合、あらゆるオリジンからページをフレームに埋め込めます。
テスト方法
ヘッダーの不在は調査開始のきっかけであり、発見事項ではありません。次の 2 つの手順を実施します。
手順 1 — ヘッダーの確認(スクリーニング)。 対象ページを取得し、レスポンスヘッダーを確認します。
curl -sI https://target.example/account/transfer | grep -iE 'x-frame-options|content-security-policy'
X-Frame-Options と CSP の frame-ancestors がどちらも存在しない場合、そのページは候補です。いずれかが存在し、制限的な設定(DENY/SAMEORIGIN/frame-ancestors 'none'|'self')になっている場合は、保護されているため終了します。
手順 2 — 実際にフレームへ埋め込めてクリックできることを証明する(実際の発見事項には必須)。 最小限の PoC を作成し、実際のブラウザーで読み込みます。
<!doctype html>
<h1>Win a prize — click below</h1>
<iframe src="https://target.example/account/transfer"
style="opacity:0.1;position:absolute;top:0;left:0;width:1000px;height:800px"></iframe>
以下のすべてを確認してください。確認できない場合、悪用はできません。
- ページが実際に iframe 内にレンダリングされること(表示を消去したりリダイレクトしたりするフレーム脱出用 JavaScript がないこと。例:
if(top!==self)による脱出、またはSec-Fetch-Dest/JavaScript によるフレームチェック)。 - フレーム内でも機密性の高い操作が機能すること。特に、その操作はクロスサイトで成功する必要があります。
SameSite=LaxまたはSameSite=Strict(現在のデフォルト)に設定されたセッション Cookie に依存している場合、クロスサイトのフレーム内リクエストでは Cookie が送信されないため、クリックジャッキングは失敗します。被害者の認証状態がフレーム内でも引き継がれることを確認してください。 - 対象が読み取り専用ページではなく、状態を変更する操作(送金、設定/メールアドレス/パスワードの変更、2FA の無効化、OAuth の承認、管理者操作)であること。
方針: まず最も機密性の高い操作ページを標的にしてください。深刻度は、被害者に実行させる操作の内容に応じて直接高まります。
誤検知
- フレーム保護のない公開済みの読み取り専用ページ(ホーム/マーケティング)は、誘導できる機密性の高い操作がないため、低リスクまたは参考情報にとどまります。
- API や HTML 以外のエンドポイント(JSON、画像)は、クリックジャッキングの標的ではありません。
- ヘッダーがないことだけでは発見事項にはなりません。 SameSite Cookie、フレーム脱出用 JavaScript、またはフレーム内で実行できる機密性の高い操作が存在しないことにより、いずれも完全に防げる場合があります。そのため、手順 2 は必須です。
報告に必要な証拠
有効なクリックジャッキングの報告では、次の内容を示します。(1)実際のブラウザーで、攻撃者が制御する iframe 内に対象ページがレンダリングされたこと。(2)被害者が認証済みの状態で、フレーム内のクリックによって状態を変更する機密性の高い操作を実行できること(クロスサイトのコンテキストでも Cookie が維持されること)。(3)オーバーレイのスクリーンショットまたは録画。動作するフレーム PoC を伴わずにヘッダーの欠如だけを報告した場合、脆弱性ではなく、ドキュメント品質の問題です。