クロスサイトスクリプティング(XSS)とは、Webサイトの脆弱性を利用し、HTMLに悪質なスクリプトを埋め込む攻撃のことです。
情報処理安全確保支援士試験の過去問に興味深いXSSの問題があったので紹介します。
クロスサイトスクリプティング(XSS)の説明
クロスサイトスクリプティング(Cross-Site Scripting: XSS) とは、Webサイトの脆弱性を悪用したサイバー攻撃の一種です。
これは、悪意のあるスクリプトをWebサイトに埋め込み、そのWebサイトを訪れたユーザーのブラウザ上で実行させることで情報を盗み出す攻撃です。

引用: https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html
これにより以下のような脅威が発生する可能性があります。
- 本物サイト上に偽のページが表示される
- フィッシング詐欺による重要情報の漏えい 等
- ブラウザが保存しているCookieを取得される
- Cookie にセッションIDが格納されている場合、さらに利用者へのなりすましにつながる
- Cookie に個人情報等が格納されている場合、その情報が漏えいする
- 任意のCookieをブラウザに保存させられる
- 攻撃用のセッションIDが利用者に送り込まれ、悪用される
- フィッシング詐欺による重要情報の漏えい 等
XSSの種類
XSSは以下の3種類に分類できます。
- タイプ1: 反射型XSS (非持続的) (Reflected XSS or Non-Persistent)
- タイプ2: 格納型XSS (持続的) (Stored XSS or Persistent)
- タイプ0: DOMベースのXSS (DOM Based XSS)
反射型XSSと格納型XSSは、サーバ側でレスポンスを組み立てる際にスクリプトとして処理してしまうタイプになります。

引用: https://warp.da.ndl.go.jp/info:ndljp/pid/12356598/www.ipa.go.jp/about/technicalwatch/20130129.html
この2つの違いは、攻撃用のスクリプトのスクリプトの記載場所になります。
反射型XSSは、攻撃者が用意した罠ページや罠メールに記載されているリンクのURLにスクリプトを埋め込むタイプになります。そのリンクをクリックしたとき、スクリプトを含むリクエストがサーバに送信されます。
一方で格納型XSSは、サーバ側のデータベースやログにスクリプトを含む文字列が格納されるタイプになります。こうした違いから、反射型XSSを非持続型、格納型XSSを持続型ともいいます。

引用: https://warp.da.ndl.go.jp/info:ndljp/pid/12356598/www.ipa.go.jp/about/technicalwatch/20130129.html
DOMベースのXSSは、クライアント側でDOMの仕組みを利用してWebブラウザ上でスクリプトが動的に生成、操作される際に悪意のあるスクリプトが挿入されることで発生します。
今回はこのうちの格納型XSSに分類される攻撃の例を紹介します。
具体例紹介:令和5年度 秋期 情報処理安全確保支援士試験 午後 問1
(画像引用: https://www.ipa.go.jp/shiken/mondai-kaiotu/2023r05.html#aki_sc)
画像1枚目は攻撃を受けているECサイトの商品レビューページになります。
16件あるはずのレビューが2件しか表示されていません。
レビューページのHTMLを確認すると画像2枚目のようになっていました。
赤枠で囲んだ部分は会員が入力したレビュータイトルが表示されるところですが、レビュータイトル内にHTMLのコメントアウトの一部とJavaScriptの内容が書き込まれています。
レビュー投稿を複数回に分けて行なうことで、レビュータイトル内のスクリプト部分以外のHTMLがコメントアウトされ、1つの大きなスクリプトが構成され、ページ閲覧時に実行されるようになっています。
この問の中では、このスクリプトが閲覧者のセッションIDを含むcookie情報を画像データアップロードAPIに送信する様になっており、攻撃者はレビューページを閲覧した会員のセッション情報を取得してなりすますことができるようになっていました。
レビュータイトル入力時に文字数制限があったにもかかわらず、XSSが成功してしまいます。
また、スクリプトがデータをアップロードする先は同じオリジンのAPIのため、Same Origin Policyでも防ぐことができません。
XSSへの対策
XSSの対策として以下のようなものがあります。
- Webページに出力する全ての要素に対して、エスケープ処理を施す。
- URLを出力するときは、「http://」や 「https://」で始まるURLのみを許可する。
- script要素の内容を動的に生成しない。
- スタイルシートを任意のサイトから取り込めるようにしない。
- (HTMLテキストの入力を許可する場合)入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する
上記の例だと、「Webページに出力する全ての要素に対して、エスケープ処理を施す。」をすることで、XSSを防ぐことができます。
まとめ
今回はXSSについて簡単に解説し、具体例として情報処理安全確保支援士試験の過去問から紹介しました。
今後入力内容やDBに格納されている文字列を、Webページに出力する処理を実装する際は、XSSの脆弱性について意識していただけると幸いです。
参考・引用
安全なウェブサイトの作り方 – 1.5 クロスサイト・スクリプティング
https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html
IPAテクニカルウォッチ 『DOM Based XSS』に関するレポート
https://warp.da.ndl.go.jp/info:ndljp/pid/12356598/www.ipa.go.jp/about/technicalwatch/20130129.html
令和5年度 秋期 情報処理安全確保支援士試験 午後 問題冊子
https://www.ipa.go.jp/shiken/mondai-kaiotu/2023r05.html#aki_sc


