クロスサイトスクリプティング(XSS)の脆弱性はWebサイトやWebアプリケーションであまりにも頻繁に見つかり、攻撃者がオンラインページに悪意のあるスクリプトを埋め込んでXSS攻撃を仕掛け、ユーザーデータを盗み取る機会を数多く与えています。
ここでは、XSS攻撃の仕組み、重要なコーディング・防止・セキュリティ対策、そしてXSS対策を容易にするさまざまなアプリケーションセキュリティ製品について解説します。
ジャンプ先:
- クロスサイトスクリプティング(XSS)の仕組み
- クロスサイトスクリプティング攻撃を防ぐ方法
- クロスサイトスクリプティング攻撃の3つのタイプ
- クロスサイトスクリプティング攻撃の実例
- XSS攻撃の防止に役立つツール
- まとめ:XSS攻撃の防止
クロスサイトスクリプティング(XSS)の仕組み
クロスサイトスクリプティング攻撃は、攻撃者が安全性の低いWebアプリケーションの検証やエンコード処理を悪用し、被害者のブラウザーに悪意のあるスクリプトを挿入することで発生します。これにより、アカウントの乗っ取り、悪意のあるWebサイトへのリダイレクト、その他の有害な活動につながる可能性があります。WebサイトがXSS攻撃に対して脆弱な場合、ユーザーの入力はコードとして実行されます。
攻撃者が脆弱なWebサイトに悪意のあるコードを作成して挿入する手順は次のとおりです。
- 悪意のあるコードの作成: 脆弱なWebサイトを脆弱性スキャンやサブドメインの列挙などの手法で見つけた攻撃者は、通常はJavaScriptで悪意のあるコードを作成し、標的Webサイトの欠陥を悪用します。
- コードの挿入: 悪意のあるコードを準備した後、攻撃者は実行可能なスクリプトを悪意のあるコードで改変し、脆弱なWebサイトに挿入します。
- 攻撃の開始:ハッキングされたWebサイトを誰かが訪問すると、悪意のあるコードがそのユーザーのブラウザーで自動的に実行されます。
- Cookieの窃取:悪意のあるコードが実行されると、ユーザーからトークン、Cookie、その他の機密データを盗み取る可能性があります。
- 不正アクセス:攻撃者は盗み取ったデータを使い、認証なしでユーザーのセッションやアカウントにアクセスします。
クロスサイトスクリプティング攻撃を防ぐ方法
幸い、適切なコーディング慣行によってXSS攻撃のリスクは軽減できます。ここでは、WebアプリケーションをXSS攻撃から守るためのコーディング技法と予防策を紹介します。適切な入力検証と出力エンコードの手法を実践することで、Webサイトのセキュリティを強化し、安全なユーザー体験を提供できます。
変数の検証
変数の検証とは、入力が指定した条件を満たしているかどうかを判定する手法です。これにより、安全で正しい構造のデータだけを通過させ、悪意のある情報がアプリケーションに混乱を引き起こす可能性を低減できます。
たとえば、フィルターや正規表現を使い、メールアドレスがユーザーに期待される形式になっているか確認します。想定した形式に従っていない場合は、機密性の高い処理を実行せず、ユーザーに通知してください。
PHPの例:
//This code assumes we are receiving an email address input
$userEmail = $_POST['email'];
// Validate the email using a filter to ensure it's in a proper email format
if (filter_var($userEmail, FILTER_VALIDATE_EMAIL)) {
// Email is valid, proceed with further processing
// ...
} else {
// Invalid email format, handle the error appropriately
// ...
}出力エンコード
XSS攻撃から保護するもう1つの方法が出力エンコードです。Webサイトに動的コンテンツ(ユーザーのコメントやメッセージなど)を表示する場合は、HTMLとしてレンダリングする前に適切にエンコードする必要があります。エンコードとは、特殊文字を無害な同等文字に変換し、ブラウザーがコードとして解釈しないようにすることです。
エンコードにより、ユーザーの投稿に含まれるスクリプトタグはスクリプトとして実行されず、通常のテキストとして表示されます。OWASPは開発者が安全にエンコードできるよう「チートシート」を提供しており、以下ではそのコーディング例をいくつか紹介します。
HTMLコンテキストでの出力エンコード
次のような2つの基本的なHTMLタグの間に変数を挿入すると、
<div> $varUnsafe </div>「$varUnsafe」としてレンダリングされるデータが改変され、Webページに攻撃が追加される可能性があります。OWASPは、Webテンプレートに変数を追加する際、HTMLエンティティエンコードを使用し、変数の配置には安全なシンク(textContentなど)を使うことを推奨しています。
HTML属性コンテキストでの出力エンコード
これは、ハイパーリンクの変更、項目の非表示、代替テキストの追加、スタイルの変更など、さまざまな用途でHTML属性値に変数を追加するものです。
例:
<div attr="$varUnsafe">
<div attr="*x" onblur="alert(1)*"> // Example Attack引用符(”および‘)は、変数が作用する場所での変更を困難にするため、XSS攻撃の防止に役立ちます。JavaScriptを使用する場合、.setAttributeと[attribute]はHTML属性を自動的にエンコードするため、安全なHTML属性を使えば安全です。
JavaScriptコンテキストでの出力エンコード
JavaScriptコンテキストでは、HTMLドキュメントに埋め込まれたインラインJavaScriptに変数を配置します。変数はHTMLページに挿入されるため、安全性を確保するには引用符で囲んだデータ値の中に配置する必要があります。
「引用符で囲んだデータ値」の例:
<script>alert('$varUnsafe')</script>
<script>x='$varUnsafe'</script>
<div onmouseover="'$varUnsafe'"</div>文字は\xHH形式でエンコードする必要があります。OWASPは開発者を支援するJavaエンコーダーを提供しています。JSONの場合、Content-Typeヘッダーはtext/htmlではなくapplication/jsonにする必要があります。
その他の出力エンコードの危険性
インラインCSSに配置する変数は、CSSプロパティ値の中に配置する必要があります。こうすれば、セキュリティを損なうことなく、ユーザーがWebページの外観を簡単に変更できます。
URLはエンコードした後、HTML属性エンコードを行う必要があります。また、JavaScriptでURLクエリ値を組み立てる場合は、window.encodeURIComponent(x)を使用してください。
OWASPは、出力エンコードを行っても安全でない「危険なコンテキスト」として、次のようなものも挙げています。
- <script>スクリプト内に直接記述</script>
- <!– HTMLコメント内 –>
- <style>CSS内に直接記述</style>
- <div ToDefineAnAttribute=test />
- <ToDefineATag href=”/test” />
- コールバック関数
- コード内で処理されるURL
- JavaScriptのイベントハンドラー(onclick()、onerror()、onmouseover())。
- eval()、setInterval()、setTimeout()などの安全でないJS関数
HTMLサニタイズ
HTMLサニタイズとは、ユーザーが生成したHTMLから危険な可能性のあるスクリプトやコンポーネントを削除する処理です。Webサイトにユーザー入力を表示する前に、HTMLサニタイズが安全網として機能し、潜在的なリスクを削除または無害化します。
たとえば、HTMLコードを含むブログ記事から危険なコンポーネントや属性をフィルタリングし、安全な内容だけをユーザーに表示します。これによりWebサイトの安全性を維持し、潜在的に危険な活動からユーザーを守れます。
WebアプリケーションでHTMLサニタイズを行うには、信頼でき、適切に保守されたライブラリを使用することが重要です。OWASPは、XSS攻撃対策に役立つツールとしてDOMPurifyを推奨しています。
その他のXSS対策
検証、エンコード、サニタイズはXSS防止の主要な手法ですが、不注意によるミスの被害を抑えるのに役立つ対策はほかにもあります。これには、JavaScriptやブラウザーがCookieとどのようにやり取りできるかを変えるCookie属性や、コンテンツの読み込みを防ぐコンテンツセキュリティポリシーの許可リストなどがあります。
関連記事:
クロスサイトスクリプティング攻撃の3つのタイプ
XSS攻撃には3つのタイプがあり、それぞれ攻撃手法と標的が異なります。以下でそれぞれについて詳しく説明します。
- 格納型XSSは、危険なスクリプトを挿入し、それをサーバー上に恒久的に残す攻撃です
- Document Object Model(DOM)ベースのXSSは、DOMを操作してユーザーのブラウザー上で直接悪意のある処理を実行します
- 反射型XSSは、被害者の入力から有害なスクリプトを反射させます
格納型XSS
格納型XSSでは、悪意のあるスクリプトやコードをWebサーバー、データベース、またはアプリケーションに長期間保存します。その後、特定のWebサイトにアクセスしたり、特定の情報を読んだりする警戒していないユーザーに、これらのスクリプトが表示されます。これを防ぐには、ユーザーが生成したすべてのコンテンツを保存前とWebサイトへの表示前にサニタイズして評価してください。

反射型XSS
反射型XSSは、悪意のあるスクリプトやコードをURLまたはリクエストパラメーターに挿入し、サーバーがレスポンス内でその入力をユーザーに返す攻撃です。ユーザーが改変されたリンクをクリックすると、気づかないうちに挿入されたスクリプトを実行してしまいます。これを防ぐには、すべてのユーザー入力、特にURLパラメーターやフォームフィールドからの情報を検証してサニタイズしてください。

DOMベースのXSS
DOMベースのXSS攻撃では、悪意のあるスクリプトがDOMを操作して処理に損害を与えます。DOMベースのXSSは、他のXSS攻撃とは異なり、サーバーとのやり取りを必要としません。これを防ぐには、DOMを動的に変更する前にユーザー入力を検証し、サニタイズすることが不可欠です。

クロスサイトスクリプティング攻撃の実例3選
British Airways、Fortnite、eBayは、XSS攻撃の実際の被害を受けた著名な3社です。攻撃者は各社のWebサイトの脆弱性を悪用して有害なスクリプトを挿入し、ユーザーデータを侵害しました。こうした注目度の高い情報漏えい事件は、進化を続けるデジタル環境において、このようなサイバー脅威から身を守り、ユーザー情報を保護するために強固なセキュリティ対策を実施することの重要性を浮き彫りにしています。
British Airways
2018年、クレジットカード情報のスキミングを手口とするハッカー集団MagecartがBritish Airwaysを標的にしました。攻撃者はFeedifyのJavaScriptライブラリに存在するXSSの欠陥を悪用し、スクリプトを改変して顧客の個人情報を偽サーバーに送信しました。その偽サーバーにはSSL証明書があり、消費者は取引が安全だと信じ込まされました。マルウェアの欠陥が発見されるまでに、ハッカーは38万件の予約取引を盗み取りました。
Fortnite
2019年、2億人以上のユーザーを抱える人気オンラインゲームFortniteで、報告されていないXSSの欠陥が見つかりました。攻撃者はこのXSSの問題と安全性の低いシングルサインオン(SSO)の脆弱性を組み合わせ、仮想通貨を盗み、プレイヤーの会話を盗聴し、混乱を引き起こした可能性があります。FortniteにはCheck Pointが攻撃について通知しましたが、当時攻撃者がこの脆弱性を悪用したかどうかは不明です。
eBay
2015年と2016年、eBayで深刻なXSSの欠陥が発生し、攻撃者がページに悪意のあるコードを挿入して販売者のアカウントに完全にアクセスできる状態になりました。被害には、商品の値引き、決済情報の窃取、高額出品の改ざんなどが含まれます。eBayは欠陥を修正しましたが、その後の攻撃は2017年まで続き、脅威との長い戦いとなりました。
XSS攻撃の防止に役立つツール
脆弱性スキャンツール、ペネトレーションテストツールとWebアプリケーションファイアウォールは、XSS攻撃の防止に役立ち、Webサイトの侵害を防げます。検討したいツールをいくつか紹介します。XSS専用に設計されたものも含まれています。
脆弱性スキャンツール
脆弱性スキャンツールは、Webアプリケーション、ネットワーク、システムのセキュリティ上の弱点を特定して評価します。コードや入力をスキャンして潜在的な脆弱性を検出し、開発者やIT・セキュリティチームに報告して、修復とパッチ適用を行います。
- XSStrikeは、さまざまなXSSの脆弱性を特定できるオープンソースのXSSスキャナーです。XSStrikeは潜在的なXSSの問題を発見するのに役立ちますが、その有効性はテスト対象のアプリケーションの特性によって異なる可能性があります。
- XSS Hunterは、セキュリティアナリストやプログラマーがXSSの脆弱性を特定して監視できるように作られました。XSSの問題を発見して確認できます。
- XSSERも、無料で利用できるオープンソースのXSSスキャナーです。XSStrikeと同様に、成功するかどうかはアプリケーションとそのセキュリティ対策によって決まります。
- Acunetixは、XSSの欠陥を含むオンラインの脆弱性を発見する効果的なツールです。広く利用され、高く評価されています。
- Burp Suiteも、オンラインアプリケーションのセキュリティ評価に広く利用され、高く評価されているツールです。Webアプリケーションをテストするためのさまざまなオプションを提供しますが、XSSの脆弱性をどの程度検出できるかは、設定と使い方によって決まります。
- Intruderも、オンラインアプリケーションのXSSの脆弱性やその他のセキュリティ上の欠陥を特定するために使われる脆弱性スキャナーです。セキュリティチェックの設定と範囲によって、その有効性が決まります。
- Dalfoxは、高速かつ効果的なオープンソースのXSSスキャンツールです。他のスキャナーと同様に、その有用性は利用する状況に左右されます。
Webアプリケーションファイアウォール
Webアプリケーションファイアウォール(WAF)は、Webアプリケーションに到達する前に悪意のあるトラフィックを監視、フィルタリング、ブロックするセキュリティアプライアンスです。門番のような役割を果たし、XSSやSQLインジェクションなどの攻撃を検出してブロックします。WAFはトラフィックを能動的に分析し、有害なリクエストをブロックすることで、リアルタイムの保護も提供します。
WAFはWebアプリケーションにさまざまな保護を提供しますが、OWASPはXSS対策におけるいくつかの限界を指摘し、「信頼性が低く、新たなバイパス手法が定期的に発見されています。WAFはXSSの脆弱性の根本原因にも対処しません。さらに、クライアント側だけで動作するXSSの脆弱性を見逃すこともあります。WAFはXSS、特にDOMベースのXSSの防止には推奨されません」と述べています。
WAF市場をリードする製品には、次のようなものがあります:
- Akamai App and API Protector:Akamaiはセキュリティサービスを提供しており、そのWAF製品はXSSを含むさまざまな攻撃からアプリケーションを守るよう設計されています。
- AppTranaは、XSSやその他のWebアプリケーションの脅威から保護するWAF機能を備えた、クラウドベースのアプリケーションセキュリティソリューションです。
- AWS WAF:Amazon Web Services(AWS)が提供するWebアプリケーションファイアウォールで、AWS上でホストされているアプリケーションをXSSなどのさまざまな脅威から保護できます。
- Cloudflare WAFは、XSS攻撃やその他のWebアプリケーションの脅威から保護する人気のソリューションです。
- Imperva WAF:Impervaはさまざまなセキュリティ製品を提供しており、そのWAFはXSSなどのさまざまな脅威からWebアプリケーションを守るよう設計されています。
- Microsoft Azure App Gateway:AzureのApplication GatewayはWAF機能を提供し、Azure上でホストされているWebアプリケーションをXSSなどの一般的な攻撃から保護します。
- F5 Advanced WAFは、WebアプリケーションをXSS攻撃やその他のセキュリティリスクから守るよう設計されています。悪意のあるコードの挿入を検出して阻止するため、シグネチャーベースと振る舞いベースの検知手法を組み合わせています。
- FASTLYは、WAF機能などのオンラインセキュリティサービスも提供するコンテンツデリバリーネットワーク(CDN)です。同社のWAFは、さまざまなXSS攻撃やその他のWebアプリケーションの脅威を認識して阻止するよう設計されています。
- Fortinet Fortiwebは、XSSなどの一般的なWebアプリケーションの脆弱性に対する防御を提供する、専用のWebアプリケーションファイアウォールです。このような攻撃を特定して阻止するため、シグネチャーベースの手法と振る舞い分析の手法を組み合わせています。
- Radwareは、XSS攻撃などさまざまな脅威からWebアプリケーションを保護するWAFソリューションを提供しています。悪意のあるコードの挿入を認識して防止するため、さまざまなセキュリティ対策を利用します。
- Wallarmは、クラウドベースのWAFを含む、アプリケーションとAPI向けのさまざまなセキュリティ機能を提供しています。機械学習と振る舞い分析を用いて、XSSやその他のWebアプリケーションの脆弱性を検出して修正します。
関連記事:
まとめ:XSS攻撃の防止
クロスサイトスクリプティング(XSS)の脆弱性はあまりにも一般的です。WebサイトやWebアプリケーションに依存する組織は、資産とブランドの評判を守るため、サイバーセキュリティと安全なコーディングの実践を優先する必要があります。XSS攻撃によって、一見無害なWebページが破壊的なスクリプトだらけになり、壊滅的な結果や顧客への被害につながる可能性があります。
Webアプリケーションを保護するには、定期的な脆弱性スキャン、HTTP-Only Cookie、出力のエスケープ、ユーザー入力の検証などの予防策を講じてください。XSS攻撃にはさまざまな手法があるため、変数の検証、出力のエンコード、HTMLサニタイズを実施することでセキュリティを強化できます。
安全でないシンクを避けるようコードをリファクタリングし、DOMPurifyのような信頼できるライブラリを利用して、安全で使いやすいWebサイトを維持してください。XSS攻撃の防止とWebアプリケーションのセキュリティを優先することで、ユーザーは安全な環境を利用できると確信できます。





