最新のクロスサイトスクリプティング(XSS)脆弱性が発覚した後、FBIとCISAは最近セキュリティ対策を強化し、サイバーレジリエンスの向上に注力しています。当然ながら、組織は基本的な対策を怠りがちであり、それがデータ侵害の発生につながっています。
クロスサイトスクリプティング攻撃は、Webアプリケーションやサービスがリクエストや入力を適切に処理できなかったり、意図した通りに機能しなかったりする場合に発生します。危険なのは、単にアプリケーションを標的とするだけでなく、その背後にあるユーザーも標的とする点です。
クロスサイトスクリプティング攻撃に関するガイドと、このテーマについて知っておくべきすべてをご紹介します。
クロスサイトスクリプティング(XSS)攻撃とは?
完璧なアプリやウェブサイトは存在せず、隠れた欠陥があります。クロスサイトスクリプティング攻撃は、悪意のあるコードを送信して機能を妨害することで、この欠陥を悪用します。この攻撃により、悪意のある攻撃者は被害者の身元情報を乗っ取り、なりすましさえ可能になります。
悪意のあるスクリプトはウェブアプリケーション内に潜んでいるため、簡単に検出されることはありません。それはアプリのソースコードに溶け込み、サービスがそれが信頼できないソースからのものかどうかを検証することを不可能にします。では、その結果はどうなるのでしょうか?
ハッカーは、あなたのウェブブラウザによって収集されたクッキー、サイトトークン、その他の機密データにアクセスできるようになります。あなたのウェブサイトやアプリがさまざまな場所にコンテンツを配信している場合、それらは自動的に傍受されます。投稿の下にコメントを残せるオンラインフォーラムやユーザー掲示板も、この攻撃の影響を受けやすい。
クロスサイトスクリプティング(XSS)攻撃の種類
XSS脆弱性は過去にワームを生み出し、アプリケーションのセキュリティ対策を損なってきました。マルウェアの拡散、認証情報のフィッシング、防衛サイトの乗っ取りを引き起こす可能性があります。
クロスサイトスクリプティング(XSS)攻撃には主に3つの種類があります。XSS攻撃の防止方法を学ぶ前に、直面する脅威を理解しましょう。具体的には以下の通りです。
1. 保存型XSS(パーシステントXSS)
これは最も基本的でありながら危険なXSSの一種です。保存型XSSとは、入力検証が不十分な場合にウェブデータベースに悪意のあるコードが保存されることを指します。攻撃者はウェブアプリの脆弱性を通じてコードを注入し、永続的に保存します。被害者は知らずにスクリプトを実行し、ペイロードがHTMLコードとしてウェブブラウザに配信されます。ウェブページを読み込むことで悪意のあるスクリプトが実行されれば、被害は確定します。
典型的な例はブログ記事へのコメントです。攻撃者はURLを添付し、被害者にクリックさせてコメントを読ませることができます。ユーザーが操作すると、コードは自動的に実行されます。
2. 反射型XSS(非永続型XSS)
攻撃者のペイロードがウェブブラウザに送信されるリクエストの一部となった場合、反射型XSS攻撃へと変化します。リクエストはブラウザで跳ね返り、HTTPレスポンスにHTTPリクエストからのペイロードが含まれるようになります。ハッカーは、ソーシャルエンジニアリング脅威、悪意のあるリンク、その他の フィッシング詐欺 手法を用いて、被害者にサーバーリクエストを実行させるように仕向けることができます。この手法の唯一の難点は、攻撃者が個々のペイロードを被害者に個別に配信する必要があることです。ペイロードを一括配信することはできず、反射型XSS攻撃のほとんどはソーシャルメディアネットワーク上で実行されます。
3.DOMベースのXSS
DOMベースのXSSは、攻撃者が制御可能なソースから悪意のあるJavaScriptコードを取得し、ユーザーアカウントをハッキングする手法です。このコードはシンクに渡され、動的に実行されて任意のブロックを実行します。ブラウザのURLが、こうしたクロスサイトスクリプティング攻撃の最も一般的なソースです。攻撃者はまた、クエリ文字列にペイロードを埋め込んだ脆弱なページへ被害者を誘導するリンクを追加します。URLの一部を分割し、被害者を誤った方向へ誘導することでさらに操作を行う場合もあります。
クロスサイトスクリプティング(XSS)の仕組みとは?
クロスサイトスクリプティングは、脆弱なウェブサイトを改ざんし、悪意のあるJavaScriptコードをユーザーに返すことで機能します。攻撃者が悪意のあるコードを注入し、被害者のブラウザ内部から実行すると、アプリケーション全体とその後のあらゆる操作を完全に侵害できます。これらはより高度なXSS攻撃の一部を構成するために使用されます。攻撃者はまた、Webアプリケーション内の特権やユーザーアクセスを掌握し、そこに格納されたデータを奪取することも可能です。
クロスサイトスクリプティング攻撃と脆弱性は、攻撃者が被害者を装い、ネットワーク全体でそのふりをすることさえ可能にします。彼らはオリジンポリシーを回避できます。異なるウェブサイトを完全に分離することができます。
さて、クロスサイトスクリプティング攻撃の仕組みを簡略化して概要を説明します:
- 攻撃者は悪意のあるリンクを送信します。クリックするとコードが注入され、動的コンテンツがウェブブラウザに配信されます。
- 攻撃者のウェブサーバーへHTTPリクエストを送信します。ハイジャッカーは盗んだクッキーを使用してあなたになりすますことができます。
- 攻撃者は機密情報にアクセスし、より高度なソーシャルエンジニアリング攻撃を実行できます。
- クロスサイトスクリプティング攻撃により、攻撃者は異なるウェブサイトを分離するための同一生成元ポリシーを回避できます。これらの攻撃は実行が容易で、企業の評判を損なう可能性があります。攻撃者はコンテンツを改ざんし、企業イメージを損なうことで組織の評判を傷つけます。
- 誤った情報を拡散したり、ウェブサイトのユーザー向け指示を変更して誤った方向へ誘導したりできます。
XSS攻撃は、特に政府機関、医療機関、危機時に重要な資源を提供する企業を標的とする場合、危険です。
クロスサイトスクリプティング(XSS)攻撃を防ぐ方法とは?
さまざまな対策があります。クロスサイトスクリプティング攻撃を防ぐ方法を知るために、それらについて学びましょう:
- Webアプリケーションやサービスの入力を検証することで、クロスサイトスクリプティング攻撃(XSS)を防ぐことができます。また、脆弱性スキャナーを使用して、ウェブサイトに他のセキュリティ上の脆弱性がないかチェックすることもできます。これはXSS攻撃を自動的に防止する最良の方法の一つです。
- XSS攻撃を防ぐ第二の方法は、出力データをエンコードすることです。理想的には、データをページに書き込む前にこれを行うべきです。使用するエンコーディングの種類は、書き込みの文脈によって異なります。
- 例えば、JavaScriptの文字列値はHTMLコンテキストとは異なるエンコーディングが必要です。HTMLコンテキストでは、ホワイトリストに登録されていない値をHTMLエンティティに変換しなければなりません。一方、JavaScript文字列コンテキストでは、英数字以外の値に対してUnicodeエスケープを確実に適用する必要があります。
- 複数のエンコーディング層が必要となる場合があり、この処理は正しい順序で適用されなければなりません。ユーザー入力をイベントハンドラに埋め込み、HTMLとJavaScriptの両コンテキストに対応する必要があります。入力到着時に検証する方法は数多く存在します。
- 例えば、ユーザーがURLを送信しレスポンスで返される場合、HTTPSやHTTPといった安全プロトコルから検証を開始できます。ユーザーがアルファベットや数字で値を提供する際の検証も可能です。また、入力文字を想定された文字セットに制限することで異なる検証方法も取れます。
その他の対策例を以下に示します:
- ウェブサイトで許可する安全なプロトコルの一覧を作成できます。これにより、デフォルトで認識されない有害なプロトコルを自動的にブロックできます。これにより、XSS攻撃がブロックリストを回避しようとして無効な値を難読化できなくなります。
- ユーザーがHTMLマークアップを投稿することは許可すべきではありませんが、場合によっては必要になることもあります。ホワイトリストを実装することで有害なタグをフィルタリングできます。安全なタグは保存され、ブラックリストに登録されたタグに関連する悪意のあるコードはすべて除外されます。ホワイトリストに登録されていないタグは、指定しない限りブラックリストに登録されたものとみなされます。
- セキュリティアップデートについては、ウェブサイトを監視する必要があります。ユーザーのブラウザから直接フィルタリングやエンコーディングを実行するために JavaScript ライブラリを使用する場合を考えてみましょう。その場合、サーバーサイドのテンプレートエンジンを使用してXSS攻撃を防ぐこともできます。これにより、HTMLに動的コンテンツを埋め込み、特定のコードを定義できます。
- 引数付きフィルターを使用し、コンテキストを定義することも可能です。これにより、ほとんどのXSS攻撃を防止できます。また、これらのエスケープ機能を見直し、テンプレートエンジンやフレームワークを継続して使用するか定期的に評価することができます。
- PHPにはエンティティをエンコードする組み込み関数もあり、値がHTMLコンテキスト内にある場合はいつでも入力値をエスケープするために呼び出すことができます。3つの引数で呼び出し可能ですが、入力値のUnicodeエスケープが必要です。PHPは文字列のUnicodeエスケープ用APIを提供していません。
- 文字列をHTMLエンティティに変換してから関数を呼び出します。カスタムHTMLエンコーダーを使用することで、クライアントサイドJavaScriptのXSS攻撃を防止できます。
クロスサイトスクリプティング(XSS)攻撃:防止策(ベストプラクティスを網羅)
XSS攻撃を防ぐために確立できるベストプラクティスは以下の通りです:
- ユーザー入力と出力データをエンコーディングでクリーンアップする。
- 特殊文字をエンコード値で置換することで、全てのデータをコードではなくテキストとして処理できるようにします。攻撃者はプレーンテキストを扱っている場合、悪意のあるスクリプトを注入できません。エンコーディングを適切に適用すれば、ユーザーがその方法で影響を受けることはありません。
- 保存・処理されるデータの種類を含め、ビジネスロジックやアプリケーションの種類に応じて、様々な種類のエンコーディングを適用できます。HTMLエンティティのエンコードなど、最も基本的な対策を含む様々なエンコード手法が存在します。属性値のエンコードも可能です。
- XSS攻撃を防ぐもう一つの有効な手法は、クライアント側で受信データをフィルタリングすることです。データフィルタリングにより、タグ、HTMLイベントハンドラ、悪意のあるJavaScript要素などの危険な文字列を除去できます。
- 入力フィルタリングと出力フィルタリングを組み合わせてウェブページのレスポンスを返すことで、保存型XSS攻撃を最も効果的に軽減できます。
- ユーザー入力の検証も安全対策の一つです。例えば、入力フィールドのデフォルトをテキストデータ型に設定すれば、ユーザーが数値を入力することは不可能になります。これはWebフォームで効果的です。入力検証により、攻撃者が認証経由で悪意のあるスクリプトをアップロードするのを防げます。Webブラウザは許可されたリソースのみにアクセスを許可し、他のドメインはすべて無視します。攻撃者がXSSインジェクションの脆弱性を発見できたとしても、注入されたスクリプトは実行されません。
- jQueryでクロスサイトスクリプティング攻撃を防ぐには、ユーザー入力をjQueryセレクタに渡す方法があります。最も一般的な手法はlocation.hashを使用し、HTMLレンダリング用にセレクタを渡すことです。jQueryはこの問題を認識し、入力がハッシュ記号で始まるかどうかをチェックするセレクタロジックをパッチ適用します。
- サイトのオリジンから読み込める画像やスクリプトなどのリソースを指定できます。攻撃者がXSSペイロードを注入しても、現在のオリジン外のリソースは読み込めません。jQueryセレクタはXSS攻撃や脆弱性の発生確率を大幅に低減します。
信頼できないデータをjQueryセレクタに渡す場合は、js—escape関数を使用して値を適切にエスケープしてください。また、コンテンツセキュリティポリシーを活用することでXSS攻撃を軽減できます。これらは外部スクリプトの管理(読み込みやインラインスクリプトの実行など)の様々な側面を制御するのに役立ちます。
一般的なXSS攻撃の例
以下に実世界で発生した代表的なXSS攻撃例を示します:
- 2018年、ブリティッシュ・エアウェイズは著名なハッカー集団MageCartに侵入されました。同集団はJavaScriptライブラリ内のXSS脆弱性を悪用。顧客データは公式サイトと類似したドメイン名の悪意あるサーバーへ送信され、38万件以上の予約取引からクレジットカード情報が不正取得されました。この侵害が発覚するまでに航空会社は巨額の損害を被りました。
- 人気オンラインマルチプレイヤーゲーム「フォートナイト」もXSS攻撃の被害に遭いました。安全でないSSOの脆弱性により、ユーザーは偽のログインページにリダイレクトされ、そこで詳細情報が盗まれました。プレイヤーはゲーム内の仮想通貨も失い、記録されたプレイヤーチャットも漏洩しました。
- eBayにはXSSの脆弱性があり、攻撃者は売り手アカウントに完全にアクセスできました。ハイジャック犯はeBayの出品リストの配置を操作し、eBayが脆弱性を発見して修正した後も攻撃を継続しました。
結論
クロスサイトスクリプティング攻撃は、オンラインプラットフォームへの信頼を損ない、ユーザーデータを危険にさらす、最も深刻なウェブセキュリティ脅威の一つです。XSS 攻撃の種類を理解し、適切な予防策を講じることで、開発者はアプリケーションのセキュリティを確保することができます。適切な対策には、入力の検証、出力のエンコード、コンテンツセキュリティポリシーの適用などが含まれます。
セキュリティ監査および高度な脅威検知ツールは、安全でセキュアなオンラインプレゼンスを確保するために不可欠です。技術が進歩するにつれて、攻撃者の手法も進化するため、警戒が最も重要です。XSS 対策を優先することで、組織は自社の評判を守り、オンラインプレゼンスの完全性を確保することができます。
FAQs
XSS攻撃とは、悪意のあるスクリプトをウェブサイトに注入し、ハッカーがユーザーの機密データにアクセスできるようにする攻撃です。XSS攻撃はウェブアプリケーションの脆弱性を悪用し、ユーザー入力や改ざんされたURLを利用することが多いです。
開発者は、ユーザー入力の検証、出力データのエンコード、許可されたスクリプトのみの実行を制限することでXSS攻撃を回避できます。定期的なセキュリティ監査やコンテンツセキュリティポリシーの導入もリスク低減に有効です。
XSS攻撃は、ユーザーがアクセスするブラウザ上で実行される悪意のあるスクリプトを注入することでウェブアプリケーションを悪用します。これによりセキュリティ制御を迂回し、機密情報にアクセスします。
XSSはデータ漏洩、金銭的損失、評判の毀損を引き起こす可能性があるため回避すべきです。またユーザーの信頼を損ない、マルウェアやフィッシング攻撃を仕掛ける可能性もあります。
脆弱性スキャナー、Webアプリケーションファイアウォール、高度な脅威検知システムなどのソリューションやツールが挙げられます。これらは脆弱性の検出や悪意のあるスクリプトの実行阻止に役立ちます。
はい。WAFはトラフィックをフィルタリングし、アプリケーションとやり取りする前に悪意のあるスクリプトを特定することで、XSS攻撃をブロックできます。
XSSテストでは脆弱性スキャナーやペネトレーションテストツールを使用し、攻撃をシミュレートして悪意のあるスクリプトの潜在的な侵入経路を発見します。
進化する脅威から保護するため、XSS脆弱性に対するセキュリティスキャンは定期的に、理想的には3か月ごとに実施すべきです。

