【セキュリティ】クロスサイト・スクリプティング(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/ より画像引用
反射型
格納型
対策
表示の際に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版(固定版) 脆弱性が生まれる原理と対策の実践』






Discussion