クロスサイトスクリプティング(XSS)とは?効果的なWeb安全対策を解説

facebookXLINEはてなブックマークpocket

クロスサイトスクリプティング(XSS)は、動的にコンテンツを生成するWebページの仕組みに起因して発生する脆弱性の一種です。この脆弱性を悪用した攻撃を受けると、Webサイトを閲覧したユーザーは個人情報の漏えいやログイン情報を悪用した不正操作などの被害を受ける可能性があります。

一方、Webサイトを運営している企業は適切な対策をしていなかったことで、社会的な信頼低下を引き起こす可能性があります。

このような事態を未然に防ぐためには、クロスサイトスクリプティングの仕組みを正しく理解し、適切な技術的対策を講じることが必要です。本記事では、クロスサイトスクリプティングの基本的な仕組みから、企業が取り組むべき具体的な対策までを、わかりやすく解説します。

クロスサイトスクリプティング(XSS)とは?効果的なWeb安全対策を解説

クロスサイトスクリプティング(XSS)とは

クロスサイトスクリプティング(XSS)とは

クロスサイトスクリプティング(XSS)とは、Webサイトに悪意のあるスクリプト(多くはJavaScript)を埋め込み、ユーザーのブラウザ上でそのスクリプトを実行させる攻撃手法です。この結果、ユーザーのCookie情報や入力データが窃取されたり、意図しない操作が行われたりするリスクがあります。また、この攻撃を引き起こすWebサイト側の脆弱性そのものも「クロスサイトスクリプティング」と呼びます。

「クロスサイト」とは、攻撃者が仕掛けたスクリプトが、ユーザーが信頼している正規サイトのドメインで実行されることを意味しています。

攻撃が自社Webサイトを通じて行われた場合、直接的な被害はユーザー側に発生しますが、攻撃の舞台となったWebサイトを運営する企業の信頼性やブランド価値が毀損されるおそれがあります。

クロスサイトスクリプティングはなぜ起こるのか

クロスサイトスクリプティングは、ユーザーからの入力データを適切に検証・無害化せず、そのままWebページ上に表示してしまうことによって発生します。攻撃者は、コメント欄やフォームなどに悪意あるスクリプトを仕込み、それがHTML内やJavaScriptの一部としてそのまま出力されることで、ユーザーのブラウザでスクリプトが実行されます。

例えば、投稿に対してユーザーが自由にコメントを書き込めるブログサイトなどでは、入力されたコメントが送信後すぐにWebページ上に反映されます。通常、投稿内容はプレーンテキストとして処理されるため問題は生じませんが、入力データに対して適切な検証や無害化処理を行われていない場合に問題が生じます。

HTMLやJavaScriptのタグがフォームに入力された場合、そのまま有効なコードとして認識されてしまい、実行されてしまうためです。<script>(悪意があるスクリプト)</script>のような形式で埋め込まれた場合、意図しないリンクの挿入やポップアップの表示、さらには悪意ある外部サイトへのリダイレクトなどが実行される可能性があります。

クロスサイトスクリプティングが発生する主な理由は、入力データに対して適切な検証や無害化処理が施されていないためです。

【クロスサイトスクリプティングが発生する流れ】

  1. 攻撃者が、標的となるWebサイトに罠を仕掛ける
  2. ユーザーが罠を仕掛けられたWebサイトを訪問する
  3. ページ内でスクリプトが実行される(ユーザー操作不要の場合もある)
  4. ユーザーCookie情報や入力データが外部に送信されたり、画面が改ざんされる
  5. 攻撃者は、取得した情報をもとに不正アクセスやさらなる攻撃に利用する

クロスサイトスクリプティング、クロスサイトリクエストフォージェリ、SQLインジェクションの違い

クロスサイトスクリプティング、クロスサイトリクエストフォージェリ、SQLインジェクションの違い

クロスサイトスクリプティングと混同しやすい攻撃手法として、クロスサイトリクエストフォージェリ、SQLインジェクションがあります。理解を深めるために、改めて違いを確認しておきましょう。

クロスサイトリクエストフォージェリ(CSRF)

クロスサイトリクエストフォージェリ(CSRF)は、不正なURLを送信してユーザーにクリックさせることでログイン中のユーザーに意図しない操作を強制的に実行させる脆弱性または攻撃です。知らないうちに意図しない投稿が行われてしまう、DDoS攻撃を行ってしまう、または認証が必要なWebサイト内で不正送金などを実行してしまうなどの被害が発生します。

Webサイトの脆弱性を悪用するという点ではクロスサイトスクリプティングと共通していますが、ユーザーに不正なリクエストを実行させるのが主な目的である点が異なります。

SQLインジェクション

SQLインジェクションは、データベースを利用しているWebサイトやアプリケーションに対して不正なSQL文を挿入して実行させる脆弱性または攻撃です。データの不正な閲覧や改ざん、削除などの被害が発生します。

こちらもWebサイトの脆弱性を悪用するという点ではクロスサイトスクリプティングと共通していますが、別の不正サイトへ誘導するのではなく、Webサイトの基盤となるデータベースに直接スクリプトを送信する点が異なります。

またSQLインジェクションによる被害は、データの改ざんや情報漏えいといったWebサイト自体への直接的な被害である点がクロスサイトスクリプティングと異なります。

クロスサイト
スクリプティング
(XSS)
クロスサイト
リクエストフォージェリ
(CSRF)
SQLインジェクション
攻撃手法 スクリプトの埋め込み 不正なURLの送信 SQL文の送信
標的となる
サイト
動的にページを生成するWebサイト URLのアクセスにより処理が実行されるWebサイト データベースを使用しているWebサイト
攻撃対象 他のユーザーのブラウザ ログインユーザーが利用できるWebサイトやアプリ Webサイト本体(データベース)
主な目的 セッション乗っ取り、情報窃取 不正操作の実行 データの不正取得・改ざん
防止策の例 入力のエスケープ処理 リクエストを照合する プレースホルダの使用、入力のエスケープ処理

クロスサイトスクリプティングによる被害

クロスサイトスクリプティングによる被害

クロスサイトスクリプティングは、過去にさまざまな有名なWebサイトで脆弱性が発見・報告されてきました。脆弱性を放置した場合、サイトの種類や規模に関係なく、ユーザーの個人情報流出やなりすまし、不正操作など深刻な被害につながる恐れがあります。

特に正規サイト内でスクリプトが実行されるため、ユーザーは攻撃を受けていることに気付かないまま被害を受けてしまうケースが多い点が特徴です。

ユーザー入力情報が漏えいする

クロスサイトスクリプティングによってWebページが改ざんされ、偽の入力フォームやポップアップが表示されることがあります。ユーザーはこれを正規のフォームと誤認し、氏名や住所、クレジットカード番号、ID・パスワードなどの情報を入力してしまい、攻撃者に送信してしまうリスクがあります。

Cookie情報が盗まれる

悪意あるスクリプトがユーザーのブラウザ上で実行されることで、document.cookieを通じてCookie内の情報(特にセッションID)が盗まれることがあります。 セッションIDが窃取されると、攻撃者はそのIDを使ってユーザーになりすまし、ログイン状態を乗っ取る「セッションハイジャック」が発生するおそれがあります。セッションハイジャックが発生した場合、攻撃者は盗まれたIDで不正な取引の実行などの悪意のある活動を行うことが可能となるリスクがあります。

画面改ざんや悪意あるコンテンツを表示する

攻撃者がWebページに偽のリンクやボタンを挿入し、ユーザーを不審な外部サイトに誘導したり、マルウェアをダウンロードさせたりするケースもあります。これによりさらなる被害(マルウェア感染や詐欺被害)が生じる可能性があります。

クロスサイトスクリプティングの攻撃から自社サイトを守るための3つの対策

クロスサイトスクリプティングの攻撃から自社サイトを守るための3つの対策

クロスサイトスクリプティングの攻撃を防ぐためには、エスケープ処理や入力値の制限、WAFの導入などの対策が効果的です。

エスケープ処理とサニタイジング

クロスサイトスクリプティングは、Webページに悪意のあるスクリプトが埋め込まれ実行されることで発生します。そのため、ユーザーからの入力値をWebページに出力する際に、スクリプトが実行されないように変換する処理が重要です。

例えば、ユーザーが入力した文字の中に「<」や「>」のような記号が含まれている場合、それをそのままWebページに表示すると、ブラウザがその部分を「プログラムの一部(タグ)」だと勘違いして動作させてしまうことがあります。

こうした誤動作を防ぐために、変換処理(エスケープ処理)を施し、ブラウザにはその記号をただの文字として表示させることで、プログラムとして作動させなくします。また、場合によっては入力時や保存時に不要なタグやスクリプトを除去・無害化する「サニタイジング」も組み合わせて実施することで、より安全性が高まります。

入力できる文字の種類や形式の制限

フォームに入力できる内容をあらかじめルールで決めておくことで、不正なデータや予期しない内容の混入を防ぐことができます。例えば、電話番号や郵便番号の欄では数字だけ、メールアドレスの欄では正しい形式のメールアドレスだけを受け付ける、といった制限を行います。

こうすることで、本来その欄に 不要な記号やプログラムの一部になるような文字列が入力されることを防ぎ、クロスサイトスクリプティングなどの攻撃リスクを減らす効果があります。

また、フォームで入力された内容をリンク(URL)として利用する場合はさらに注意が必要です。ユーザーが「javascript:~」という形で入力すると、意図せずプログラムが動いてしまうおそれがあります。そのため、URLとして使う場合は「http://」や「https://」で始まるものだけを許可するなどのチェックを行うことが重要です。

但し、これらの入力制限は補助的な対策であり、最終的にはWebページに表示する際に「エスケープ処理」を必ず行うことが重要です。

WAFの導入

WAF(Web Application Firewall)は、Webアプリケーションを狙った攻撃をリアルタイムで検知・遮断するセキュリティツールです。クロスサイトスクリプティングの兆候があるリクエスト(不審なスクリプトの含まれたリクエスト)をブロックし、被害の発生を未然に防ぐことができます。

但し、WAFはあくまで「防御の補完的な役割」であり、Webアプリケーション自体が適切なエスケープやサニタイジングなどの対策を講じていることが前提となります。WAFとアプリケーション側の対策を併用することで、多層的な防御体制を構築することが重要です。

コンテンツセキュリティポリシー(CSP)を導入してセキュリティを強化するという選択肢も

近年、クロスサイトスクリプティングなどから自社のWebサイトを保護する仕組みとして注目されているのがコンテンツセキュリティポリシー(CSP)です。これは、Webサイト運営側が、HTTP通信時に利用されるHTTPレスポンスヘッダーにデータの取得に関するルールを記述するもので、悪意があるスクリプトが読み込まれたとしても、ブラウザ上で実行されるのを防止できます。

非常に効果的なソリューションですが、実装および維持費用が高額なためすべてのWebサイトにおいて適しているわけではありません。基本的な対策を行ったうえでさらに対策を追加したいケースや、被害が起きた場合の損害が大きく、強固なセキュリティ保護を追加したいケースなど、自社サイトの規模や重要性によって導入を判断することが必要です。

自社だけでセキュリティ対策を行うのは難しいと感じたら

自社だけでセキュリティ対策を行うのは難しいと感じたら

クロスサイトスクリプティングをはじめとするセキュリティリスクは、Webサイトのいたるところに存在します。これらの脅威に対して適切な対策を講じることは不可欠ですが、専門的な知識や経験を持つ人材の確保が難しく、十分なセキュリティ体制を整えられていない中小企業も少なくありません。

また、単一の対策だけでは、クロスサイトスクリプティングをはじめとする多様な攻撃から自社サイトを完全に守ることは困難です。攻撃手法は日々巧妙化しており、従来のように「一度安全と判断した通信やアクセスはそのまま信頼する」といった境界型の考え方だけでは、十分な防御ができなくなっています。

こうした背景から、近年はすべての通信やアクセスを常に検証する「ゼロトラストセキュリティ」という考え方が、世界的なセキュリティの新たな基準として注目されています。

こうした課題に直面している場合は、外部のセキュリティサービスを活用することが有効な選択肢となります。

楽天モバイルでは「サイバーセキュリティサービス」を提供しています。これは企業のIT資産に対して定期的な診断を実施し、脆弱性を可視化することで、リスクの早期発見と対策を支援するサービスです。さらに、サイバー攻撃への防御策や従業員向けの教育プログラムも提供されており、効率的かつ実践的なセキュリティ強化が可能です。効率的にセキュリティ対策を行いたい企業におすすめです。

また、クラウドサービスやリモートワークを積極的に活用している企業にとっては、「ゼロトラストセキュリティサービス」の導入も検討すると効果的です。従来の境界型防御では対応が難しい高度なサイバー攻撃に対しても、徹底したアクセス認証や不正な挙動を早期に検知・対応する体制を提供することで社内のIT資産を的確に保護します。セキュリティの強化をお考えでしたら、導入をご検討ください。

関連サービス

ゼロトラストセキュリティ

ゼロトラストで安心・安全なセキュリティ環境へ
楽天モバイルでは、ワンストップで快適で安全なネットアクセスを実現し、セキュリティ関連業務の一元管理によって企業のセキュリティレベルを向上させるとともに、大幅なコスト削減にも繋がる「ゼロトラストセキュリティ」の導入をサポートします。