Cross-site scripting (クロスサイトスクリプティング)

クロスサイトスクリプティング(XSS)とは、悪意あるクライアントサイドのコードを Web サイトに差し込むセキュリティ攻撃です。差し込まれたコードは被害者のブラウザー上で実行され、アクセス制限の回避やユーザーへのなりすましなどにつながります。Open Web Application Security Project の調べによると、XSS は 2017 年において 7 番目に多い Web アプリの脆弱性 でした。

この攻撃が成功してしまうのは、Web アプリにバリデーションとエンコーディングが十分に実装されていない場合です。ユーザーのブラウザーは、悪意あるスクリプトを信頼できないものとして検知できません。そのため、任意の cookie やセッショントークン、Web サイト固有の機密情報などにアクセスされたり、悪意あるスクリプトによって HTML のコンテンツが書き換えられてしまいます。

クロスサイトスクリプティング攻撃は、1) 信頼できない送信元(ほとんどは Web リクエスト)から Web アプリにデータが入力されるとき、または 2) 悪意あるコンテンツかどうかの検査をせずに動的なコンテンツを Web ユーザーに送信するときに起こります。

往々にして悪意あるコンテンツは JavaScript を含んでいますが、HTML や Flash、ブラウザーで実行可能な他のコードを含んでいる場合もあります。XSS に基づく攻撃手法はほぼ無限に存在しますが、cookie やセッション情報といった秘密の情報を攻撃者に送信したり、攻撃者の用意した Web ページに被害者をリダイレクトさせたり、本来の Web サイト(脆弱性を含む)を装いつつユーザーのマシン上で悪意ある処理を行ったりすることが多いです。

XSS 攻撃の種類は、格納型(持続型)・反射型(非持続型)・DOM-based の 3 つに分類することができます。

格納型 XSS 攻撃
差し込まれたスクリプトは、標的のサーバー内に永続的に格納されます。データに対するリクエストをブラウザーが送信し、サーバーから悪意あるスクリプトを受け取ることで被害が発生します。
反射型 XSS 攻撃
悪意あるリンクをクリックするよう誘導されたユーザーが、特別に細工されたフォームを送信してしまったり、悪意あるサイトを閲覧してしまったりすることで、差し込まれたコードが脆弱な Web サイトへ送信されます。Web サーバーはエラーメッセージや検索結果、リクエストの一部を含んだレスポンスなどによって、そのスクリプトをユーザーのブラウザーへ送信(反射)します。それまでユーザーはその Web サーバーと通信しており、ブラウザーは「信頼できる」サーバーからのレスポンスとみなすため、悪意あるコードがブラウザー上で実行されてしまいます。
DOM-based XSS 攻撃
クライアントサイドに元々あるスクリプトを利用し、(被害者のブラウザーにおける) DOM 環境を変更した結果、ペイロードが実行されます。すなわち、そのページ自身は変わりませんが、DOM 環境に悪意ある変更を加えたことにより、本来とは異なる方法でクライアントサイドのコードが実行されてしまいます。

関連項目

一般知識