クリックジャッキングとは?仕組みや被害例、対策を初心者向けにわかりやすく解説【図解付き】
はじめに
Webセキュリティについて学んでいると、クリックジャッキング(Clickjacking)という言葉を見かけることがあります。
しかし、
- クリックしただけで、なぜ攻撃が成立するのか
- フィッシングやCSRFとは何が違うのか
- iframeは危険な機能なのか
- 利用者とWebサイト運営者は、どのように対策すればよいのか
と疑問に思う方も多いのではないでしょうか。
クリックジャッキングとは、簡単に言うと、
「利用者に見えているボタンとは別の、透明または見えにくいボタンをクリックさせる攻撃」
です。
攻撃者は、正規のWebページをiframeなどで別のページに重ねて表示し、利用者が意図していない操作を実行させます。
例えば、利用者は「動画を再生する」ボタンを押したつもりでも、実際には背後にある「設定を変更する」「商品を購入する」といったボタンを押している可能性があります。
この記事では、クリックジャッキングの仕組み、被害例、CSRFやフィッシングとの違い、X-Frame-OptionsやCSPによる対策について、会話形式でわかりやすく解説します。
クリックジャッキングとは?

クリックジャッキングって、どんな攻撃なの?

利用者をだまして、本人が意図していないボタンやリンクをクリックさせる攻撃だよ。

偽物のボタンを押させるの?

偽物を押させるというより、見えているボタンの裏側に、本物のWebページのボタンを隠しておくイメージだね。

画面の裏に別のボタンがあるの?

そう。透明にした正規サイトの画面を、攻撃者の用意したページに重ねて表示するんだ。

透明な紙を重ねる例で考えてみよう

画面を重ねると言われても、少し想像しにくいな。

透明な紙で考えてみよう。
机の上に、次のような申込書が置かれているとしよう。
- 商品を購入する
- アカウントを削除する
- 設定を変更する
その申込書の上に、透明な紙を重ねる。
透明な紙には、
「ここを押すとプレゼントがもらえます」
と書かれているよ。

利用者にはプレゼントのボタンだけが見えているんだね。

そう。でも、そのボタンの位置が、下にある「商品を購入する」ボタンと重なっていたらどうなる?

プレゼントを受け取るつもりで、商品を購入してしまう。

それがクリックジャッキングの基本的なイメージだよ。

クリックジャッキングの仕組み

クリックジャッキングは、一般的に次のような流れで行われるよ。
- 攻撃者が罠となるWebページを作る
- 正規のWebページを
iframeなどで罠のページ内に読み込む - 正規ページを透明、または見えにくい状態にする
- 正規ページの重要なボタンと、偽のボタンの位置を重ねる
- 利用者を罠のページへ誘導する
- 利用者が偽のボタンをクリックする
- 背後にある正規ページの操作が実行される

攻撃者が正規サイトへ不正ログインするわけではないの?

そこが重要なんだ。利用者がすでに正規サイトへログインしている状態を悪用することがある。

ログイン中の利用者自身に操作させるんだね。

そう。正規サイトから見ると、ログイン済みの利用者が自分でボタンを押したように見える場合があるんだ。

iframeとは?

さっきから出てくるiframeって何?

あるWebページの中に、別のWebページを表示するためのHTML要素だよ。
例えば、Webページ内に次のようなものを埋め込む場合に利用されるよ。
- 動画
- 地図
- 広告
- 決済画面
- 外部のWebコンテンツ

それなら普通に使われている機能だよね。

その通り。iframe自体は悪いものではないよ。

正しい機能を攻撃者が悪用しているんだ。

そう。正規サイトを自分のページ内に表示し、透明化や位置調整によって利用者をだますんだよ。

クリックジャッキングで起こり得る被害

具体的には、どんな操作をさせられるの?

Webサービスの機能によって異なるけれど、例えば次のような被害が考えられるよ。
| 被害の例 | 内容 |
|---|---|
| 設定変更 | 公開範囲やプライバシー設定を変更される |
| 不正購入 | 本人の意図しない商品を購入させられる |
| 送金・契約 | 金銭に関係する操作を実行させられる |
| アカウント操作 | 退会、削除、権限変更などを実行させられる |
| SNS操作 | フォロー、投稿、評価などを行わせる |
| アクセス許可 | カメラやマイクなどの利用許可を押させる |
| 広告操作 | 不正に広告をクリックさせる |

ログインしているとなぜ危険なの?

正規サイトにログインしていると危険なの?

ログインしていること自体が危険というわけではないよ。ただし、クリックジャッキングではログイン状態が悪用されることがあるんだ。

どうして?

ブラウザが正規サイトのCookieなどを使って、ログイン済みの状態でページを表示する場合があるからだよ。
例えば、利用者がSNSへログインしたまま罠のページを開いたとする。
罠のページ内に正規SNSの設定画面が読み込まれ、ボタンが透明な状態で重ねられていると、利用者のクリックによって設定変更が実行される可能性があるよ。

攻撃者がパスワードを盗まなくても、利用者自身に操作させられるんだね。

そう。それがクリックジャッキングの厄介なところだよ。

UIリドレッシングとは?

UIリドレッシング(UI Redressing)って聞いたんだけど。これは関係ある?

クリックジャッキングは、UIリドレッシングの代表的な手法として扱われるよ。
UIとは、利用者が操作する画面やボタンなどを意味し、
リドレッシングには、「着せ替える」「外見を変える」といった意味がある。
つまりUIリドレッシングは、
本来の操作画面を別の見た目で覆い、利用者に誤った操作をさせる手法
ということだね。
| 用語 | 意味 |
|---|---|
| クリックジャッキング | クリック対象を偽装して意図しない操作をさせる攻撃 |
| UIリドレッシング | 画面の見た目を偽装して操作を誘導する手法 |
| iframe | Webページの中に別のページを表示するHTML要素 |

クリックジャッキングとフィッシングの違い

利用者をだますなら、フィッシングと同じじゃないの?

どちらも利用者をだます攻撃だけど、目的や仕組みが違うよ。
| 項目 | クリックジャッキング | フィッシング |
|---|---|---|
| 主な目的 | 意図しない操作を実行させる | IDやパスワードなどを入力させる |
| 主な手法 | 画面やボタンを重ねる | 偽サイトや偽メールを使う |
| 利用者の操作 | 本物のボタンを知らずに押す | 偽物の入力画面へ情報を入力する |
| 正規サイト | iframeなどで利用されることがある | 見た目をまねた偽サイトが使われることが多い |
| 代表的な被害 | 設定変更、購入、許可操作 | 認証情報や個人情報の窃取 |

フィッシングは情報を入力させて盗む。クリックジャッキングは操作そのものを実行させるんだね。

基本的にはその整理でいいよ。

クリックジャッキングとCSRFの違い

CSRFとも似ている気がする。

どちらも、ログイン中の利用者に意図しない処理を実行させる可能性がある点は似ているね。

違いはどこ?

クリックジャッキングは、利用者のクリックを利用する。CSRFは、攻撃者が用意したリクエストを正規サイトへ送信させる攻撃だよ。
| 項目 | クリックジャッキング | CSRF |
|---|---|---|
| 正式名称 | Clickjacking | Cross-Site Request Forgery |
| 日本語 | クリック乗っ取り攻撃 | クロスサイト・リクエスト・フォージェリ |
| 主な手法 | 画面を重ねてクリックを誘導する | 不正なリクエストを送信させる |
| 利用者の操作 | クリックが必要になることが多い | ページ閲覧だけで成立する場合もある |
| 主な対策 | frame-ancestors、X-Frame-Options | CSRFトークン、SameSite Cookie、再認証 |
| 共通点 | ログイン状態が悪用される可能性がある | ログイン状態が悪用される可能性がある |

クリックジャッキングは画面の問題で、CSRFはリクエストの問題なんだね。

クリックジャッキングとXSSの違い

XSSとはどう違うの?

XSSは、脆弱なWebページへ不正なスクリプトを埋め込み、利用者のブラウザ上で実行させる攻撃だよ。
| 項目 | クリックジャッキング | XSS |
|---|---|---|
| 主な対象 | 画面とクリック操作 | Webページ内で実行されるスクリプト |
| 主な手法 | 透明な画面を重ねる | 不正なJavaScriptなどを埋め込む |
| 主な被害 | 意図しない操作 | Cookie窃取、画面改ざん、不正処理 |
| 主な対策 | フレーム表示の制限 | 出力時のエスケープ、入力検証、CSP |

クリックジャッキングでは、必ずしも正規サイトへ不正なコードを埋め込む必要はないんだね。

攻撃者側のページで正規サイトを重ねて表示することで成立する場合があるよ。

似た攻撃との比較
| 攻撃 | だます対象 | 主な手口 | 覚え方 |
|---|---|---|---|
| クリックジャッキング | クリック操作 | 透明な画面を重ねる | 押した場所を乗っ取る |
| フィッシング | 利用者の判断 | 偽サイトへ誘導する | 偽物に入力させる |
| CSRF | Webリクエスト | 不正な要求を送信させる | 本人として処理させる |
| XSS | ブラウザ上の処理 | 不正なスクリプトを実行する | ページ内でコードを動かす |
| セッションハイジャック | セッション情報 | Cookieなどを盗む | ログイン状態を乗っ取る |
クリックジャッキングへの対策
クリックジャッキング対策は、主にWebサイト運営者・開発者側で行います。
代表的な対策には、次のものがあります。
- CSPの
frame-ancestorsを設定する X-Frame-Optionsを設定する- 重要操作の前に再認証を求める
- 確認画面を設ける
- Cookieの
SameSite属性を適切に設定する - 重要な操作を一度のクリックだけで完了させない

CSPのframe-ancestorsによる対策

CSPって何?

Content Security Policyの略で、Webページで許可するコンテンツや動作を制限する仕組みだよ。
CSPのframe-ancestorsディレクティブを使うと、そのWebページをどのサイトのフレーム内に表示してよいかを指定できる。
例えば、どのサイトからもフレーム内に表示させたくない場合は、次のように設定する。
Content-Security-Policy: frame-ancestors 'none';
同じオリジンのページからだけ表示を許可する場合は、次のように設定する。
Content-Security-Policy: frame-ancestors 'self';
特定のサイトだけに埋め込みを許可することもできるよ。

攻撃者のページに正規サイトを読み込ませないようにするんだね。

そう。クリックジャッキングは対象ページをフレーム内に表示することへ依存するため、埋め込みを制限することが有効なんだ。

X-Frame-Optionsによる対策
X-Frame-Optionsは、Webページをフレーム内に表示できるかどうかを指定するHTTPレスポンスヘッダーです。
代表的な設定値には、次のものがあります。
| 設定値 | 内容 |
|---|---|
DENY | 同一サイトを含め、すべてのフレーム表示を禁止する |
SAMEORIGIN | 同一オリジンのページからの表示だけを許可する |
すべてのフレーム表示を禁止する例は、次のとおりです。
X-Frame-Options: DENY
同一オリジンだけを許可する例は、次のとおりです。
X-Frame-Options: SAMEORIGIN
かつてはALLOW-FROMという値もありましたが、現在のブラウザでは十分に対応されておらず、CSPのframe-ancestorsを利用する方法が適切です。

frame-ancestorsとX-Frame-Optionsの違い

両方ともフレーム表示を制限するなら、何が違うの?

frame-ancestorsの方が新しく、柔軟に許可先を設定できるよ。
| 項目 | CSP frame-ancestors | X-Frame-Options |
|---|---|---|
| 役割 | フレーム内への埋め込み元を制限する | フレーム内への表示を制限する |
| 設定の柔軟性 | 複数の許可元を指定しやすい | 主に全面禁止か同一オリジン |
| 代表的な値 | 'none'、'self'、許可するURL | DENY、SAMEORIGIN |
| 位置付け | 現在の主要な対策 | 古いブラウザへの補助として使われることがある |
現代のWebアプリケーションでは、CSPのframe-ancestorsが主要な対策として利用されます。
互換性を考慮して、X-Frame-Optionsも併せて設定する場合があります。両方が指定されている場合、frame-ancestorsに対応したブラウザは、通常そちらを優先します。

再認証や確認画面も有効

フレーム表示を禁止すれば、それだけで十分?

重要な操作では、複数の対策を組み合わせた方がいいよ。
例えば、次の操作を行う前にパスワードを再入力させるんだ。
- アカウント削除
- 送金
- パスワード変更
- メールアドレス変更
- 権限変更

透明なボタンを一度押させるだけでは、処理を完了できなくするんだね。

そう。IPAも、重要な処理の直前に再度パスワード認証を行う方法を対策の一つとして示しているよ。
確認画面を設ける場合も、単純に同じ位置の「はい」ボタンを追加するだけではなく、操作内容を利用者が確認できる設計が重要なんだ。

SameSite Cookieとの関係

Cookieの設定でも対策できるの?

補助的な対策として、CookieのSameSite属性が役立つ場合があるよ。
| 設定値 | 概要 |
|---|---|
Strict | 原則として別サイト経由ではCookieを送らない |
Lax | 一部の通常遷移では送るが、クロスサイト送信を制限する |
None | クロスサイトでもCookieを送る。Secureが必要 |
SameSite=StrictまたはLaxを適切に設定すると、攻撃者のサイト内に正規ページを表示した場合でも、認証Cookieが送信されにくくなることがあります。
ただし、Webサービスの仕様によって必要な設定が異なるため、SameSiteだけに頼るのではなく、frame-ancestorsなどと組み合わせることが大切です。

利用者側でできる対策

利用者側では、何をすればいいの?

クリックジャッキングは、利用者だけで完全に防ぐのが難しい攻撃だよ。基本的にはWebサイト側の対策が重要なんだ。
それでも、利用者側では次の点を意識できるよ。
- 不審なWebサイトを開かない
- 不自然にクリックを求めるページを警戒する
- ブラウザを最新の状態にする
- 利用後は重要なWebサービスからログアウトする
- 重要な操作後は履歴や設定を確認する
- 不審な広告やゲーム画面をむやみに連打しない

怪しいサイトで「ここを連打してください」と言われたら注意した方がいいんだね。

そうだね。ただし、見た目だけで見抜けないこともあるから、サイト運営者側で根本的な対策を行う必要があるよ。

クリックジャッキング対策のメリット・注意点
| 対策 | メリット | 注意点 |
|---|---|---|
CSP frame-ancestors | 許可する埋め込み元を柔軟に指定できる | 正規の埋め込み用途を確認する必要がある |
X-Frame-Options | 設定が比較的簡単 | 許可先の細かな指定には向かない |
| 再認証 | 重要操作の不正実行を防ぎやすい | 利用者の操作負担が増える |
| 確認画面 | 誤操作に気づきやすくなる | 画面設計が不十分だと回避される可能性がある |
| SameSite Cookie | クロスサイトでの認証状態悪用を抑えられる | サービスのログイン連携などへ影響する場合がある |
| 操作ログ・通知 | 不審な変更を早期発見しやすい | 攻撃そのものを直接防ぐ対策ではない |
対策によるデメリットはある?

フレーム表示を全部禁止すればいいんじゃない?

そのサイトが本当にフレーム表示を必要としないなら、それでもいいよ。
ただし、Webページを別のサービスへ正式に埋め込む必要がある場合、全面的に禁止すると正常な機能まで利用できなくなるよ。

全面禁止にするとダメな場合があるんだ。

例えば、次のようなケースだよ。
- 社内ポータルへの埋め込み
- 決済サービスとの連携
- パートナー企業のページへの表示
- Webシステム内での画面統合

試験対策としてのポイント
クリックジャッキングは、情報セキュリティやWebアプリケーションの脆弱性に関する問題で出題される可能性があります。
ITパスポートでは攻撃の概要、基本情報技術者試験や応用情報技術者試験では、攻撃手法と対策の組合せを問われる可能性があります。
| 用語 | 試験対策ポイント |
|---|---|
| クリックジャッキング | 見えている画面とは異なる対象をクリックさせる攻撃 |
| iframe | Webページ内に別のWebページを表示する要素 |
| UIリドレッシング | 本来の画面を別の見た目で覆う手法 |
X-Frame-Options | フレーム内への表示を制限するHTTPヘッダー |
DENY | すべてのフレーム表示を禁止する |
SAMEORIGIN | 同一オリジンからのフレーム表示だけを許可する |
CSP frame-ancestors | ページを埋め込めるサイトを指定する |
| CSRF | 利用者の権限で不正なリクエストを実行させる攻撃 |
| SameSite Cookie | クロスサイトでのCookie送信を制御する |

「透明なフレームを重ね、利用者に意図しないクリックをさせる」という仕組みだと覚えよう。

対策は、CSPのframe-ancestorsと、X-Frame-Optionsだね。
まとめ
クリックジャッキングとは、正規のWebページを透明または見えにくい状態で別のページに重ね、利用者に意図していないボタンやリンクをクリックさせる攻撃です。
利用者は動画の再生やプレゼント応募のボタンを押したつもりでも、実際には背後にある設定変更、購入、送金、退会などのボタンを押している可能性があります。
主な対策は、CSPのframe-ancestorsやX-Frame-Optionsを設定し、攻撃者のWebページから正規サイトをフレーム内に読み込ませないことです。
重要な処理では、再認証や確認画面、SameSite Cookieなどを組み合わせる多層的な対策も大切です。
最後にポイントを整理します。
| 項目 | 内容 |
|---|---|
| 用語 | クリックジャッキング |
| 英語 | Clickjacking |
| 一言でいうと | 見えないボタンをクリックさせる攻撃 |
| 主な手法 | 正規ページを透明なiframeなどで重ねる |
| 悪用されるもの | 利用者のクリックとログイン状態 |
| 主な被害 | 設定変更、購入、送金、削除、許可操作 |
| 主な対策 | CSP frame-ancestors、X-Frame-Options |
| 補助的な対策 | 再認証、確認画面、SameSite Cookie |
| CSRFとの違い | 画面とクリックを悪用する点 |
| フィッシングとの違い | 情報入力ではなく操作を実行させる点 |
| 覚え方 | 「見えるボタンと、実際に押すボタンが違う」 |

クリックジャッキングは、普通のボタンを押したように見せて、裏側にある別のボタンを押させる攻撃なんだね。

その理解でバッチリ。利用者の目に見える画面と、実際のクリック対象をずらすのが特徴だよ。

フィッシングは偽サイトへ情報を入力させて、CSRFは不正なリクエストを送らせる。クリックジャッキングは、クリックそのものを利用するんだね。

そう。試験では、その違いを整理したうえで、CSPのframe-ancestorsやX-Frame-Optionsが対策になることを覚えておこう。

