クロスサイトスクリプティング(XSS)とは
クロスサイトスクリプティング(XSS)は、Webアプリケーションのセキュリティ上の
脆弱性、またはその
脆弱性を悪用した攻撃の一種です。CWE(共通
脆弱性タイプ一覧)では、不適切な入力処理によって発生するインジェクションの一種として分類されています。XSSは、攻撃者がWebサイトに悪意のあるスクリプトを埋め込み、そのスクリプトが他のユーザーのブラウザで実行されることで、様々な被害を引き起こす可能性があります。
XSS攻撃の概要
背景
Webサイトは、
JavaScriptのような
クライアントサイドのスクリプトを使って、ユーザーの操作に応じて動的にHTMLを生成します。スクリプトは強力な権限を持っており、悪用されるとcookieの読み書き、ユーザー情報の取得、他のサイトへの情報転送などが可能になります。そのため、Webブラウザには同一生成元ポリシーという、スクリプトの実行を制限する仕組みがあります。このポリシーは、あるWebページで実行されているスクリプトが、別のWebページのデータにアクセスできるのは、両ページのオリジン(プロトコル、ホスト名、ポート番号)が一致する場合のみ、と定めています。
XSS攻撃の目的と特徴
XSS攻撃は、標的サイトの
脆弱性を利用して、悪意のあるスクリプトを標的サイトの権限で実行することを目的とします。これにより、同一生成元ポリシーによる制限を回避し、cookieの窃取など、様々な攻撃が可能になります。XSS攻撃では、攻撃者がWebサイトの入力経路に不正なデータを注入し、そのデータがWebページのHTMLに組み込まれて、ユーザーのブラウザで実行されます。
XSS脆弱性とXSS攻撃の詳細
ユーザーが入力した値をそのままWebページに表示する(エコーバック)処理は、XSS
脆弱性の典型的な例です。例えば、ユーザーの性別を選択させるフォームで、選択された値をそのままHTMLに表示するページがあるとします。
php
$gender = $_GET['gender'];
echo "入力した性別は以下のもので正しいでしょうか:";
echo $gender;
?>
この例では、攻撃者がgenderの値に``をセットし、被害者がこのページにアクセスすると、悪意のあるスクリプトが実行されてしまいます。
インジェクション方法
悪意のあるスクリプトを注入する方法は、Webページの
脆弱性によって異なります。ここでは、GETメソッドとPOSTメソッドを使った例を紹介します。
GETメソッドの場合
GETメソッドでは、変数の値がURLに表示されます。攻撃者は、URLに悪意のあるスクリプトを埋め込み、被害者にそのURLをクリックさせることで攻撃を成功させます。
例:
http://example.com/?gender=
POSTメソッドの場合
POSTメソッドでは、変数の値はURLには表示されませんが、攻撃者はHTMLフォームを使って悪意のあるスクリプトを送信できます。
例:
html
隠蔽工作
攻撃者は、
JavaScriptやiframeタグ、CSSを使って、攻撃を隠蔽することができます。例えば、`document.write`を使ってHTMLの内容を消去したり、iframeをCSSで隠したりすることができます。
インジェクションする言語
XSS攻撃に利用できるスクリプトは
JavaScriptに限りません。CWE-79では、HTMLタグ、HTML属性、マウスイベント、Flash、ActiveXなども対象としています。
XSSの被害
攻撃者はXSSを使って、以下のような被害を引き起こす可能性があります。
情報漏洩 (cookieやセッション情報の窃取)
セッションハイジャック
Webサイトの改ざん
フィッシング詐欺
ユーザー端末の乗っ取り
ワームの実行
個人情報の奪取
攻撃手法の分類
XSSの攻撃手法は、大きく以下の3つに分類できます。
1. 反射型XSS (非持続的): 攻撃者が不正なデータをURLに仕込み、そのURLをクリックした被害者が攻撃を受ける。
2. 格納型XSS (持続的): 攻撃者が不正なデータをWebサイトのデータベースなどに保存し、そのデータを表示したユーザーが攻撃を受ける。
3. DOMベースXSS: Webアプリケーションではなく、ブラウザなどのクライアント側で悪意のあるスクリプトが実行される。
対策
XSS攻撃を防ぐためには、以下の対策が必要です。
1. エスケープ処理: ユーザーが入力した値をHTMLに表示する際に、HTML特殊文字をエスケープする。(例: `<` を `<` に変換する)
2. 入力値の検証: 入力された値が想定された形式であるか検証する。
3. セキュリティフレームワークの利用: XSS対策が組み込まれたフレームワークを利用する。
4. Content Security Policy(CSP): ブラウザに読み込みを許可するリソースを制限する
エスケープ処理の限界
エスケープ処理は有効な対策ですが、スクリプトが直接記述可能な箇所や、URLを記述可能な箇所に対しては効果がありません。そのため、他の対策と併用することが重要です。
引用符で囲んだ属性値に対するXSS
HTMLの属性値を引用符で囲んでいても、引用符自体をエスケープしないとXSSを防ぐことはできません。
例:
html
上記に対して、攻撃者が以下のURLを被害者にクリックさせると、onmouseoverイベントハンドラによって悪意のあるスクリプトが実行されてしまいます。
http://example.com/?name="+onmouseover%3d"(悪意のあるスクリプト)
まとめ
XSSは、Webアプリケーションのセキュリティにおける深刻な脅威です。適切な対策を講じ、安全なWebサイトを構築することが重要です。開発者は、ユーザーの入力を適切に処理し、XSS攻撃のリスクを最小限に抑える必要があります。
参考文献
CWE-79 クロスサイトスクリプティング
IPA セキュア・プログラミング講座 第7章 エコーバック対策 スクリプト注入
IPA テクニカルウォッチ「DOM Based XSS」に関するレポート
安全なウェブサイトの作り方 改訂第7版
OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet
OWASP XSS Filter Evasion Cheat Sheet
金床『ウェブアプリケーションセキュリティ』
データハウス、2007年7月21日。
ISBN 978-4887189409。
徳丸浩『体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践』SBクリエイティブ、2011年3月1日。ISBN 978-4797361193。
徳丸浩 -
XSS再入門
@IT - クロスサイトスクリプティング対策の基本
XSSの対策方法 - CircleCI