クロスサイトスクリプティング(XSS)は、ウェブアプリケーションを標的とするコードインジェクションセキュリティ攻撃で、ユーザーのウェブブラウザーで実行する悪意のあるクライアントサイドスクリプトを送ります。標的は直接攻撃されるわけではなく、脆弱なウェブサイトやウェブアプリケーションなどを利用し、ユーザーがインタラクトする際にクロスサイトスクリプティング攻撃を実行します。
例えば、何の疑いも持たないユーザーが攻撃を受けたサイトにアクセスした場合、その時点で攻撃者の悪意あるスクリプトが読み込まれ、ユーザーのブラウザで実行されます。これにより、機密データの漏出や盗難、セッションハイジャックなど多くの被害が発生します。多くのウェブブラウザやプラットフォーム全体を幅広くサポートしていることから、JavaScriptがXSS攻撃者に多く攻撃されていますが、ブラウザでサポートされていればどのような言語でも攻撃を作成することができます。XSS攻撃は15年以上使われていますが、非常に効果的であることが証明されており、今でも一般的かつ実行可能な攻撃ベクトルとしてよく見られます。
ウェブページがクロスサイトスクリプティングによって攻撃されると、すぐにさまざまな問題が現れます。考えられる問題には、以下のようなものがあります:
機密ユーザーデータの公開
クロスサイトスクリプティングは直ちに検知して対応しなければ、組織に害を及ぼす可能性があります。マルウェアが注入されると企業とクライエントの両者がXSS攻撃のリスクにさらされ、評判や取引関係が悪影響を受ける可能性があります。
クロスサイトスクリプティング攻撃の不運な例として、2018年末に広がった「Magecart」と呼ばれるクレジットカード詐欺マルウェアが注目されました。このマルウェアはオンライン決済サイトに自らを注入するもので、この種の攻撃がこれほどの規模で行われたのは初めてのことでした。ユーザーのクレジットカード情報はおそらく攻撃者が管理するサーバーにアップロードされ、売買されたか、不正な購入に使用されたものと考えられます。
クロスサイトスクリプティング攻撃は一般的に以下の種類に分類されます。
反射型XSS攻撃では、ターゲット自身のウェブブラウザから送られるデータ(つまり悪意のあるスクリプト)を受け入れる脆弱なウェブサイトを利用してターゲットを攻撃します。悪意のあるスクリプトがクライアント自身から送られるもので、脆弱なサーバーに保存されていないため、この種の攻撃は「非蓄積型」とも呼ばれます。
反射型XSS攻撃の分かりやすい例としては、XSSに対して脆弱な検索ページのあるサイトにクエリパラメータとして小さな悪意のあるスクリプトをパスするURLを作成するなどです:
http://vulnerable-website.com/search?search_term=「<script>(ここに悪意あるスクリプトを記述)」</script>
その場合、攻撃者は、ターゲットにウェブブラウザからこのURLを訪問してもらう必要があります。これを実現するために、URLを含むメールを送信する(ユーザーがそれをクリックしたくなるもっともらしい理由をつけて)、またはターゲットがクリックできるよう、脆弱性のない一般のウェブサイトでURLを公開します。
ターゲットが実際にリンクをクリックすると、脆弱性のあるサイトは、「search_term」というクエリパラメータを受け付けます。サイトはこの値を、ターゲットがvulnerable-website.comのサイトで検索したいものと想定しますが、この値は実は悪意のあるスクリプトです。ユーザーが何かを検索しているときに多くのウェブサイト検索ページがそうするように、この検索ページも「<seach_term>...を検索中」と表示しますが、脆弱性のあるサイトがsearch_term値に反応するようになっていないため、ターゲットのブラウザに読み込まれているウェブページに悪意のあるスクリプトが注入され、それがターゲットのブラウザによって実行されます。
名前の通り、蓄積型XSSでは、脆弱性のあるサーバー自体にスクリプトが保存、蓄積されます。ターゲットによって悪意のあるスクリプトが送信される反射型攻撃とは異なり、ユーザーは脆弱性のあるサイトやアプリとの通常のやり取りの最中に攻撃を受けます。
蓄積型XSS攻撃の分かりやすい例は、攻撃者が脆弱なウェブサイトでホストされているフォーラムにメッセージを投稿するなどです。通常の悪意のないフォーラム投稿とは異なり、この投稿内容には攻撃者の悪意のあるスクリプトが含まれます。ユーザーがこのフォーラム投稿を訪問すると、ウェブブラウザが悪意のあるスクリプトを読み込み、実行します。
このように、反射型と蓄積型XSS攻撃の主な違いは、蓄積型XSSが脆弱なサイトやアプリの全ユーザーを攻撃対象としていることです。
XSS攻撃のもう1つのタイプは、DOMベースです。サイトやアプリが必ず訪問者に提供しているクライアント側スクリプトには、脆弱性が存在するものです。この攻撃はサイトやアプリがターゲットのブラウザに悪意のあるスクリプトを直接送らないという点で、反射型や蓄積型XSS攻撃とは異なります。DOMベースXSS攻撃ではサイトやアプリに脆弱性のあるクライアント側のスクリプトがあり、それがターゲットのブラウザに悪意のあるスクリプトを送ります。反射型攻撃と同様に、DOMベース型攻撃は脆弱性のあるサーバー自体に悪意のあるスクリプトを保存しません。
DOMベースXSS攻撃の分かりやすい例は、上記の反射型XSSの例と同様です。攻撃者は「search_term」として悪意のあるスクリプトを作成し、ターゲットを誘います。ターゲットがURLをクリックすると、ブラウザはサイト検索ページと脆弱性のあるクライアント側で処理スクリプトを読み込みます。「seach_term」が処理のためにサイトバックエンドにクエリパラメータとして送られる一方で、サイト自体は注入された悪意のあるスクリプトを使用したウェブページを生成しません。代わりに、サイトの脆弱なクライアント側スクリプトはローカル(ターゲットのブラウザ)で動的に検索語の値(悪意のあるスクリプト)に代わるよう設計されているため、ターゲットのブラウザが攻撃者のスクリプトを読み込み、実行します。
DOMベースXSS攻撃は、XSSの脆弱性がサーバー側ソフトウェアに限定されていないという事実を浮き彫りにするものです。
クロスサイトスクリプティング攻撃には複数のバリエーションがあるため、企業は適切に自らを守り、将来的な問題を防ぐ方法を知る必要があります。ウェブサイトの複雑化により、これまで以上に厳密なモニタリングが困難になっています。時間の経過とともに、攻撃の頻度は増え続けるでしょう。
ユーザーをXSS攻撃から守るために、以下の方法をご提案します。
ユーザー入力のサニタイズ:
ユーザー入力データの使用制限:
コンテンツセキュリティポリシーの利用:
定期的にウェブアプリケーションの脆弱性スキャンツールを使用して、ソフトウェアのXSSに対する脆弱性を確認してください。