クロスサイトスクリプティング(XSS)とは、悪意あるクライアントサイドのコードを Web サイトに差し込むセキュリティ攻撃です。差し込まれたコードは被害者のブラウザ上で実行され、 アクセス制限の回避やユーザへのなりすましなどにつながります。Open Web Application Security Project の調べによると、XSS は 2013 年において 3 番目に多い 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 環境に悪意ある変更を加えたことにより、本来とは異なる方法でクライアントサイドのコードが実行されてしまいます。
より詳しく
一般的な知識
- クロスサイトスクリプティング (Wikipedia)
- Cross-site scripting (OWASP)
- クロスサイトスクリプティングに関する別の記事