はじめに
反射型XSSは、非永続型攻撃とも呼ばれ、最も基本的なクロスサイトスクリプティング攻撃の一つです。この記事では、反射型XSS攻撃がどのようなものか、その代表例と予防のベストプラクティスについて解説します。
クロスサイトスクリプティングとは何か?
XSSは、ウェブアプリの欠陥の一つで、攻撃者が外部サイトの内容にコード(通常はHTMLやJavaScript)を混入できる脆弱性です。被害者が汚染されたページを訪れると、そのコードが被害者のアプリ内で実行され、攻撃者は同一生成ポリシーを回避して個人情報を取得する可能性があります。
反射型(非永続型)XSS攻撃は、脆弱なウェブアプリから送信されたリクエストに悪意あるペイロードが組み込まれ、サーバにそのまま反映されることでHTTPレスポンスに含まれる場合に発生します。攻撃者はフィッシングなどのソーシャルエンジニアリング手法で被害者を騙し、ウェブサーバへのリクエストに悪意ある内容を盛り込みます。被害者のアプリは、このHTTPレスポンス内の悪意ある内容を実行します。
反射型XSS攻撃は一回限りの性質があり、各被害者が悪意あるペイロードを含むリクエストを送信する必要があります。そのため、攻撃者はできるだけ多くのクライアントを騙そうと試みます。多くのクライアントがクリックしやすい悪質なメール、SNS投稿、エラーメッセージ、または検索結果ページなどを狙うことが一般的です。反射型XSSは、攻撃者が脆弱なウェブアプリに恒久的な悪質スクリプトを埋め込む必要がないため、最もよく知られるXSS攻撃の一種です。
ウェブサーバから反射されるスクリプト(エラーメッセージ、検索項目、その他レスポンス内の情報など)に悪意ある内容が含まれる場合、これを反射型クロスサイトスクリプティングと呼びます。反射型攻撃はメールやフィッシングなど、別の手段で被害者に送られ、被害者が悪意ある内容やリンクをクリックすることでアプリ内で実行されます。検索フィールドは反射型XSSの代表例です。
反射型XSS攻撃を成功させるため、攻撃者はクライアントの入力がそのままレスポンスの生成に使用される箇所を探します。これは通常、スクリプトを含んではいけないimgタグやonload、onmouseoverなどの属性が使われる場合に見られます。これらの要素には、入力検証や出力エンコードなどの対策が十分に施されていないことが多いです。反射型XSSの例を以下に示します。
例 1
検索文字列をクエリパラメータから取得するウェブアプリを考えてみます。
http ://target.com/aform.html?search=Gaurav
HTMLページ上で、サーバはクライアントから送信された検索値を表示します。PHPを用いてURLから値を抽出し、この例ではHTMLを生成しています。
<?php echo 'You Searched: ' . $_GET["search"]; ?>
クライアントの入力がそのままURLを通じて渡され、入力検証や出力エンコードが行われていない状況をご覧ください。被害者がこのURLをクリックすると、悪意ある内容が実行され、情報が攻撃者に送信される可能性があります。
http://target.com/aform.html?search=<script>alert('XSS by Gaurav');</script>
例 2
アプリが専用ページでエラーメッセージを表示する場合、反射型XSSが発生することがあります。基本的に、このページはパラメータとして受け取ったメッセージをそのままレスポンスの一部として表示します。
下記のURLはエラーメッセージを表示する例です。
http ://target.com/blunder/5/Error.ashx?message=Sorry%2c+an+error+occurred
返されたページのHTMLソースを見ると、アプリがURLのmessageパラメータの値をそのまま表示していることが分かります。
<p>Sorry, a blunder occurred.</p>
エラーメッセージが検証されていないため、攻撃者は悪意ある内容を容易に追加し、ポップアップを発生させる可能性があります。
http://target.com/blunder/5/Error.ashx?message=<script>alert("XSS by GAURAV")</script>
このリンクをクリックすると、元のメッセージではなく、以下のHTMLレスポンスが表示されます。
<p><script>alert("XSS by GAURAV");</script></p>
反射型XSSを防ぐ方法についてお悩みの場合、以下にいくつかの対策や緩和策をご紹介します。
まず第一に、クライアント側では不審なリンクをクリックしないことが最も重要です。不審なリンクは、以下のような場所に見受けられます:
しかし最終的には、サイト管理者が利用者を守る責任があります。
また、ウェブアプリのファイアウォール(WAF)は反射型XSS攻撃を防ぐ上で重要な役割を果たします。WAFは、入力検証が不十分な場合でも、特定のセキュリティルールや各種ヒューリスティックスを活用して不正なリクエストを阻止します。これには、反射型XSS攻撃を試みるリクエストも含まれますが、これだけに限定されるものではありません。
格納型XSS攻撃がサイトへの悪意あるリクエストを阻止するのに対し、反射型XSS攻撃はクライアントのリクエストに影響を及ぼします。これは、他のサイト利用者に被害が及ばないよう守るための措置です。
WallarmのクラウドWAFは署名検出を利用して反射型XSSを防ぎます。また、Wallarmネットワーク全体から攻撃情報を収集し統合するオープンサポート技術により、全てのクライアントを守る手助けを行っています。
さらに、高度なセキュリティヒューリスティックス、例えばIPの悪評をチェックして常習的な攻撃者やボットネットを追跡することで、GoTestWAFはゼロデイ脅威に迅速に対応し、クライアント全体を新たなリスクから守ります。最後に、WallarmのAPIセキュリティプラットフォームは、製品全体を守る堅実な対策となります。
最新情報を購読