【セキュリティ】クロスサイト・スクリプティング(XSS)の基本

に公開

はじめに

現代のWebアプリケーション開発において、クロスサイト・スクリプティング(XSS)は最も普遍的かつ危険なセキュリティ脆弱性の一つです。XSS攻撃が可能な状態というのは、攻撃者が任意のスクリプトコードを被害者のブラウザ上で実行できる状態を意味し、これによりセッション情報の窃取や偽装操作、マルウェア拡散など深刻な被害が生じます。
本記事では、XSSの根本的な仕組みから最新の防御手法まで、実践的な観点を交えながら体系的に解説します。

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


https://eset-info.canon-its.jp/malware_info/special/detail/221115.html より画像引用

WebアプリケーションにXSS脆弱性がある場合の影響

  • サイト利用者のブラウザ上で、攻撃者の用意したスクリプトの実行によりクッキー値を盗まれ、利用者がなりすましの被害にあう。
  • 同じくブラウザ上でスクリプトを実行させられ、サイト利用者の権限でWebアプリケーションの機能を悪用される。
  • Webサイト上に偽りの入力フォームが表示され、フィッシングにより利用者が個人情報を盗まれる。
    Webアプリケーションには外部から変更できるパラメータを表示する箇所が多数含まれるが、そのうち一箇所でもXSS脆弱性があると、サイトの利用者がなりすましの被害を受ける恐れがある。

※Crossサイト・Sameサイトの違い


https://it-infomation.com/samesite-crosssite-sameorigin-crossorigin/ より画像引用

反射型

格納型


https://www.ubsecure.jp/blog/cross-site-scripting より画像引用

対策

表示の際にHTMLで特殊な意味をもつ記号文字(メタ文字)をエスケープすること

XSS脆弱性

発生箇所

Webアプリケーション上でHTML、JavaScriptを生成している箇所

影響を受けるページ

Webアプリケーション全体が影響を受ける

影響の種類

Webサイト利用者のブラウザ上でのJavaScriptの実行、偽情報の表示

利用者の関与の度合い

罠サイトの閲覧、メール記載のURLの起動、攻撃を受けたサイトの閲覧など

対策の概要

・属性値はダブルクウォート「""」で囲む
・HTMLで特別な意味を持つ記号文字をエスケープする

攻撃手法と影響

①クッキー値の盗み出し

外部から注入されたJavaScriptによってセッションIDの読み出しが可能

受動的攻撃により別人のクッキー値を盗み出す

罠サイトの構造の例
①罠サイトの iframe 内で、脆弱なサイトが表示される
②脆弱なサイトはXSS攻撃により、クッキー値をクエリ文字列につけて、情報収集ページに遷移する
③情報収集ページは受け取ったクッキー値をメールで攻撃者に送信する

②その他のJavaScriptによる攻撃

APIは悪用することも可能なため、XSSとJavaScriptの組み合わせによる攻撃がしやすいため、使用する際には注意が必要。

XSSを悪用したワーム(XSS Worm)は、XSS(クロスサイトスクリプティング)の脆弱性を利用して、自動的に拡散する悪意のあるスクリプトのこと。
このワームは、ユーザーのブラウザ上で動作し、他のユーザーにも感染を広げることで、急速に拡散する特徴がある。

XSSワームの仕組み
①XSS脆弱性のあるサイトを利用
攻撃者は、XSS脆弱性のあるサイトを見つける。この脆弱性は、ユーザー入力が適切に処理されず、スクリプトが実行される場合に発生する。

②ワームスクリプトを仕込む
攻撃者は、悪意のあるスクリプト(ワーム)を脆弱なサイトに仕込む。
このスクリプトが行なう動作
・ユーザーのセッション情報(クッキーなど)を窃取
・他のユーザーに自動的に感染するためのリンクやメッセージを生成
・ユーザーのアクション(例: ボタンクリック)を自動化

③ワームの拡散
ユーザーが脆弱なサイトにアクセスすると、ワームスクリプトが実行される。
このスクリプトで他のユーザーに感染を広げる方法
・自動投稿:ユーザーのアカウントを利用して、SNSやフォーラムに自動的に悪意のあるリンクを投稿する。
・メッセージ送信:ユーザーの連絡先リストを利用して、メッセージやメールを自動送信する。
・リダイレクト:ユーザーを他の脆弱なサイトにリダイレクトし、さらに感染を広げる。

④連鎖的な拡散
感染したユーザーが他のユーザーとやり取りするたびに、ワームが自動的に拡散する。
これにより、ワームは急速に広がり、大規模な影響を及ぼすことがある。

③画面の書き換え

XSS脆弱性はログイン機能のないサイトでも影響がある。
$_POSTの前につける@はエラー制御演算子というもので、POST変数が未定義の場合のエラーを抑止するために使用する。
◎XSS攻撃は常にJavaScriptを使うとは限らない。
(例)元の form を隠し、新たな form 要素を追加することにより画面を改変する

反射型XSS・持続型XSS

反射型XSS

攻撃用のJavaScriptが、攻撃対象サイトとは別のサイトにある場合
多くの場合、入力値をそのまま表示するページで発生する。
典型例:入力値の確認用ページ


※『体系的に学ぶ安全なWebアプリケーションの作り方 第2版(固定版) 脆弱性が生まれる原理と対策の実践』より引用

持続型XSS

攻撃用のJavaScriptが、攻撃対象のデータベースなどに保存される場合
WebメールやSNSなどが典型的な攻撃ターゲット
HTMLを生成している箇所に原因がある。


※『体系的に学ぶ安全なWebアプリケーションの作り方 第2版(固定版) 脆弱性が生まれる原理と対策の実践』より引用

脆弱性が生まれる理由

HTML生成の際に、HTMLの文法上特別な意味を持つ特殊記号(メタ文字)を正しく扱っていないことにより、開発者の意図しないHTMLやJavaScriptを注入・変形されているため。

まとめ

本記事で解説したように、XSS対策は単一の技術で完結するものではなく、入力検証、出力エスケープ、コンテンツセキュリティポリシー(CSP)、HTTPOnly属性などの多層的な防御が不可欠です。特に近年では、ReactやVueなどのモダンなフレームワークがデフォルトで提供するXSS防御機能に過信せず、常に根本的な原理を理解しておくことが重要となりますので、しっかり理解して実践していきましょう。
最後までお読みいただき、ありがとうございました。

参考文献・画像引用元URL

『体系的に学ぶ安全なWebアプリケーションの作り方 第2版(固定版) 脆弱性が生まれる原理と対策の実践』
https://eset-info.canon-its.jp/malware_info/special/detail/221115.html
https://it-infomation.com/samesite-crosssite-sameorigin-crossorigin/
https://www.ubsecure.jp/blog/cross-site-scripting

Discussion