「クロスサイトスクリプティングとはどのような攻撃なのか?」
「クロスサイトスクリプティングの名前は聞いたことがあるけど、対策方法が分からない…」
クロスサイトスクリプティング(XSS)とは、Webアプリケーションに悪意のあるスクリプトを埋め込まれる脆弱性のことです。通称、XSSと呼ばれ、クロスサイトスクリプティング攻撃を受けると、ユーザーがなりすましの被害にあったり、偽のページを表示されたりする可能性があります。
また、クロスサイトスクリプティングは様々なバリエーションがあり、対策を施すべき箇所が多い脆弱性として知られています。
そこで、本記事では以下の内容について解説します。
- クロスサイトスクリプティングの仕組み
- クロスサイトスクリプティング攻撃を受けた際の被害
- クロスサイトスクリプティングへの対策
クロスサイトスクリプティングの脆弱性に課題を抱えている方は是非ご一読いただき、自社のWebアプリケーションのセキュリティを強化していただければと思います。
Webアプリケーションのセキュリティ対策にお悩みの方、必見!
クロスサイトスクリプティングの対策は、何から取り組むべき?
Webシステムの脆弱性をチェックし、最適な対策を実施することが大切です。 まずは、サービス紹介資料をご覧ください。
クロスサイトスクリプティングとは?
クロスサイトスクリプティング(Cross-Site Scripting)とは、スクリプトを仕込んだページやリンクなどを用意しておき、何も知らないユーザーにそのリンクを踏ませることで脆弱性のあるWebサイトからユーザーの情報を抜き取る攻撃のことであり、またそういった攻撃ができてしまう脆弱性を指します。通称「XSS」と表記されます。
スクリプトには様々な種類がありますが、Cookieを盗んで個人情報を奪うことを目的とした悪意のあるスクリプトが多いため、危険視されています。
IPA(独立行政法人情報処理推進機構)発表の「2023年第1四半期の脆弱性対策情報データベースJVN iPediaの登録状況」によると、クロスサイトスクリプティングが343件、境界外書き込みが262件、SQLインジェクションが140件と、クロスサイトスクリプティングはWebアプリケーションに限らず、総合的な脆弱性の中でも最も件数の多い脆弱性であることがわかります。
クロスサイトスクリプティングの脆弱性が生じやすいのは、ユーザーの入力した値に応じて出力されるページが変化する箇所です。入力値を出力する際の実装に問題があると、悪意のあるスクリプトを埋め込まれ、実行されてしまう恐れがあります。
クロスサイトスクリプティングのしくみ
クロスサイトスクリプティングは、以下のような仕組みで成立します。
クロスサイトスクリプティングは、罠ページと脆弱性のあるページという2つのサイトをまたいで(クロスサイト)スクリプトを実行させるという特徴があります。
上記の例では、罠ページを訪れたユーザーが、スクリプトを埋め込まれたリンクを踏んで脆弱性のあるページへと遷移しており、「罠ページ」と「脆弱性のあるページ」という2つのサイトをまたいでいます。これがクロスサイトスクリプティングの仕組みです。
クロスサイトスクリプティング攻撃を受けると何が起こるのか?
クロスサイトスクリプティング攻撃を受けると、以下のような被害が発生する恐れがあります。
- Cookieに含まれる認証情報の漏えい
- なりすましの被害
- 偽のページの表示
典型的な被害が、Webアプリケーションの認証情報を含むCookieを盗まれてしまうことです。Cookieに含まれるセッションIDを盗み出せば、ユーザーになりすましてWebアプリケーションにアクセスできてしまいます。ユーザーの個人情報を閲覧できるページにアクセスすれば、氏名や住所といった情報の閲覧が可能です。
クロスサイトスクリプティングの対策
本章では、クロスサイトスクリプティングの対策について紹介していきます。
クロスサイトスクリプティング攻撃は、入力値に含まれた特殊な記号がそのまま出力されることで起こります。そのため、全てのWebサイトにおいて、特殊な記号にエスケープ処理を実施する必要があります。
また、属性値をダブルクォーテーションで囲むといった、扱う情報やプログラムの実装方法に応じて必要となる対策もあり、これらは脆弱性が生じにくい状態にするための根本的な対策です。
ただし、クロスサイトスクリプティングには対策が必要な箇所が非常に多く、漏れが生じやすいという問題点があるため、リスクを軽減するための保険的な対策の実施も重要です。
ここからは、根本的な対策と保険的な対策に分けてご紹介します。
脆弱性対策として必ず行いたい4つの「根本的な対策」
まずは、クロスサイトスクリプティングのリスクを大幅に減らす根本的な対策について解説します。
1. 特別な記号にエスケープ処理を施す
クロスサイトスクリプティングの根本的な対策として、「特別な記号にエスケープ処理を施す」というものがあります。
クロスサイトスクリプティングの脆弱性が生じる原因は、HTMLの文法上に特別な意味を持っている記号を適切に処理できていない、という点にあります。入力値に含まれる特別な記号がそのまま機能してしまうことで、スクリプトの実行につながってしまいます。
そのため、特別な記号にエスケープ処理を施して文字そのものとして処理することでスクリプトが無害化されるため、クロスサイトスクリプティングへの根本的な対策になります。
エスケープ処理の対象となる記号と、そのエスケープ処理後の文字列の例は以下の通りです。
エスケープの対象となる記号 | エスケープ処理後の文字 |
---|---|
< | < |
> | > |
& | & |
“ | " |
‘ | ' |
/ | / |
近年では、主要なフレームワークやライブラリには基本的なクロスサイトスクリプティングの対策が施されています。エスケープ処理を自動的に実施してくれるフレームワーク・ライブラリも多いため、積極的に活用しましょう。
しかし、Webアプリケーションの要件としてHTMLを表示させたい場面では、エスケープ処理の実装も必要になります。主要なフレームワーク・ライブラリを使用しているからといって全面的に信頼せず、保険的な対策や脆弱性診断の実施を検討しましょう。
2. 属性値をダブルクォーテーションで囲む
HTMLタグを出力している箇所では、その属性値をダブルクォーテーション(”)で囲まなければなりません。属性値をダブルクォーテーションで囲んでいない場合、属性値の後ろに空白を追加することで、新しい属性を追加することができてしまうため、クロスサイトスクリプティングの脆弱性につながります。
属性値をダブルクォーテーションで囲んだ上で、囲まれた属性値内にダブルクォーテーションが入力された場合は「"」にエスケープする必要があります。
この対策を実施することで、属性値内に新しい属性を追加してJavaScriptを実行させる、という攻撃を防ぐことができます。
3. 「http」「https」スキームだけを許可する
HTMLの属性の中には、a要素のhref属性、img要素のsrc属性のように、URLを属性値として使用するものがあります。これらのURLが外部からの入力値に基づいて動的に生成される場合、クロスサイトスクリプティング攻撃につながる恐れがあります。
特に、URLが「javascript:」の形式(JavaScriptスキーム)で始まる場合は、JavaScriptが起動してしまい、悪意のあるスクリプトが実行される危険性があります。そのため、URLとしては「http」および「https」スキームのみを許可することで、URLからのJavaScriptの実行を防ぐことができます。
Javaで開発を行っている方へ
Javaを使う時に知っておきたい脆弱性情報を「Javaの脆弱性|攻撃による影響や被害事例を元に2つの有効な対策を紹介」にて説明しています。攻撃を受けた際の影響範囲や、被害を防ぐために有効な対策について記載していますので、是非一度お読みいただく事をおすすめいたします。
4. 適切なDOM操作を実装する
クロスサイトスクリプティング攻撃には多くのバリエーションがあります。その中の1つが「DOMベースのクロスサイトスクリプティング」です。
DOMとは、HTMLやXMLの構成要素をプログラム上で参照・操作する仕組みのことです。DOMを使うことで、JavaScriptからHTMLやXMLを操作することが可能となります。DOMの操作に不備があると、外部から指定されたHTMLタグなどが有効になってしまい、クロスサイトスクリプティング攻撃が実行されます。
DOMベースのクロスサイトスクリプティングへの対策として、適切なDOM操作の実装が求められます。具体的には、ユーザーの入力値を元にHTMLを組み立てる際は「document.write()」や「innerHTML」などの利用を避け、「textContent」を使用するといった対策が必要です。
必要に応じて対応したい3つの「保険的な対策」
続いて、クロスサイトスクリプティングの保険的な対策について解説します。
ここで紹介する対策は保険的な対策に留まります。したがって、クロスサイトスクリプティングの脆弱性に対する根本的な対策を実施した上で、これらの対策を併用することが重要です。
1. 各種ヘッダーの指定
レスポンスヘッダーの中には、クロスサイトスクリプティング攻撃の防止に役立つものがあります。そうしたレスポンスヘッダーを指定しておくことで、クロスサイトスクリプティングのリスクを軽減することが可能です。
例えば、「x-xss-protection」ヘッダーは、ブラウザの「XSSフィルタ」を有効にするパラメータです。クロスサイトスクリプティング攻撃を検出した際に、ページの読み込みを停止する機能があります。ただし、2023年2月現在、ほとんどの主要なブラウザでサポートされなくなっており、代わりに「Content-Security-Policy」ヘッダーの利用が推奨されています。
2. CookieへのHttpOnly属性の指定
クロスサイトスクリプティングへの根本的対策というよりは、攻撃が試みられた場合においてCookie情報の漏えいを防止する仕組みとして、「HttpOnly」属性の指定が挙げられます。
「HttpOnly」属性を設定されたCookieには、HTML内のスクリプトからはアクセスできないようになります。そのため、仮にクロスサイトスクリプティング攻撃を受けたとしても、JavaScriptによるCookie情報の盗み出しを防止することができます。
「HttpOnly」属性はあくまでも、Cookie情報の盗み出しを防ぐ機能に過ぎないため、その他の被害に遭うリスクが残っていることに留意してください。また、ブラウザによって対応状況にも差があるため注意が必要です。
3. 入力値の検証
クロスサイトスクリプティング攻撃は、入力値に含まれた特殊な記号がそのまま出力されてしまうことで起こります。エスケープ処理を実施することで、根本的な対策ができますが、入力値を事前に検証することで保険的な対策も可能です。
この対策はあくまでも、入力値に利用できる文字種が英数字のみに限定できる場合など、限られた場面でしか利用できません。基本的にはエスケープ処理で対策を実施することをおすすめします。
クロスサイトスクリプティングの対策には脆弱性診断がおすすめ
クロスサイトスクリプティングは対策が必要な範囲が非常に広く、攻撃のバリエーションも豊富なため、対策に漏れが生じやすい脆弱性です。自社で対策を実施しても不安が残る場合には、「脆弱性診断の実施」や「脆弱性診断ツールの導入」などの対応を検討することをおすすめします。これらを活用することで、より効果的かつ包括的な対策を実施することができます。
脆弱性診断の実施
セキュリティに詳しくない場合、全ての脆弱性に対処することは困難です。
診断ベンダーなどのセキュリティ専門家に脆弱性診断を依頼して、クロスサイトスクリプティングの脆弱性を洗い出してもらうことをおすすめします。
脆弱性診断を実施することで、検出された場合の該当箇所、および対応策の提示をしてもらえるだけでなく、他の危険な脆弱性の有無もチェックしてもらえるので、セキュアなWebアプリケーションの運用に役立ちます。
▼関連記事
脆弱性診断(セキュリティ診断)とは|必要性からやり方まで、すべて解説
脆弱性診断ツールの導入
診断ベンダーに依頼せず、自社で脆弱性診断を実施することも可能です。
脆弱性診断ツールを導入すれば、自社の都合に合わせて迅速な診断を実施でき、ベンダーに何度も依頼するよりもコストを抑えることができます。専門知識がなくても使いやすいものを選ぶことで、脆弱性対策が容易に行えます。
診断業務を内製化し、自社のWebアプリケーションを強化したい方は、診断ツールの導入も検討してみることをおすすめします。
▼関連記事
脆弱性診断ツール(サービス)|有料・無料の違いと5つの選定ポイント
WAFの導入
WAF(ワフ)を入れることもクロスサイトスクリプティングに有効です。
WAFとは、Webアプリケーションの脆弱性を狙う攻撃を防ぐためのセキュリティ製品です。導入することでクロスサイトスクリプティングを含む、さまざまな攻撃を防ぐことができます。ただしWAFでは防げない攻撃もあるため、脆弱性診断など他の製品と組み合わせて不足を補うことが重要です。
▼関連記事
WAFとは|どこまで守れる?セキュリティ対策の効果をわかりやすく解説
まとめ|常に脆弱性の上位に存在するクロスサイトスクリプティングの対策には脆弱性診断が有効
クロスサイトスクリプティングとは、以下の特徴をもつ脆弱性です。
- ユーザーに悪意のあるスクリプトを実行させ、なりすまし・個人情報の漏えい・偽のページを表示するといった被害を発生させてしまう攻撃である。
- クロスサイトスクリプティング攻撃は、入力値に含まれた特殊な記号がそのまま出力されることが原因で発生する。
クロスサイトスクリプティングの根本的な対策は以下になります。
- 特別な記号にエスケープ処理を施す
- 属性値をダブルクォーテーションで囲む
- 「http」「https」スキームだけを許可する
- 適切なDOM操作を実装する
根本的な対策がある一方で、クロスサイトスクリプティングは対策が必要な範囲が非常に広く、攻撃のバリエーションも豊富なため、対策に漏れが生じやすい脆弱性です。
自社で対策を実施しても不安が残る場合には、脆弱性診断の実施や、脆弱性診断ツールの導入を検討してみてはいかがでしょうか。
脆弱性診断を定期的に行うことで、クロスサイトスクリプティングを含むさまざまな脆弱性を見つけることができます。自社のWebサイトから被害を発生させないためにも、脆弱性診断を導入すると良いでしょう。