問題 31★★★

メールのリンクを開いた顧客に、自社ECサイトの正規のドメインのページで偽のログイン欄が表示され、 入力したIDとパスワードが攻撃者に送られた。リンク先は自社サイトの検索結果ページで、URLの 検索語の部分にスクリプトが含まれていた。自社サイト側の原因として、最も適切なものはどれか。

正解:ウ

各選択肢の解説

  1. ア検索のSQL文を、入力された検索語の文字列連結で組み立てていた。

    誤り。これはSQLインジェクションの原因です。悪用されるとデータベースの内容が読み出されますが、 顧客の画面に偽の入力欄が出ることはありません。この場面で動いたのは顧客のブラウザ上の スクリプトで、データベースへの命令ではありません。

  2. イログイン画面を、暗号化していないHTTPの通信で提供していた。

    誤り。暗号化していなければ通信経路で盗聴されるおそれはありますが、それは経路上で盗み見る被害です。 この場面ではIDとパスワードが、ページ内で動いたスクリプトによって攻撃者へ送られています。 盗まれ方が経路の盗聴か、画面の乗っ取りかで区別します。

  3. ウ受け取った検索語を、エスケープせずに検索結果ページへ出力していた。

    正解。検索語に含まれたスクリプトが、そのままページの一部として顧客のブラウザで動きました。 クロスサイトスクリプティングで、ページは本物のドメインから届くのでURLを見ても気づけません。

  4. エキャッシュDNSサーバが、偽の応答を受け入れてキャッシュしていた。

    誤り。これはDNSキャッシュポイズニングで、正しいドメイン名でも攻撃者のサーバに誘導されます。 ドメインが正規に見える点は似ていますが、この場面のページは自社のサーバから届いており、 問題はページの中身にスクリプトが入り込んだことです。

理解を深めるために

本物の店の看板の下に、偽の受付が立つ

本物の店の中で、客が書いた注文票の文字をそのまま店内の掲示板に貼り出すとします。 誰かが「受付はこちら、暗証番号を書いて」と書いた紙を注文票として出せば、 本物の店の中に偽の受付ができてしまいます。入力をそのまま画面に出すWebサイトで これが起きるのがクロスサイトスクリプティングです。

なぜ正規のドメインで偽の入力欄が出るのか

  • 検索結果ページは、URLで受け取った検索語を「〇〇の検索結果」のように画面に出す
  • 検索語をエスケープせずに出すと、スクリプトがページの一部として顧客のブラウザで実行される
  • スクリプトは偽のログイン欄を表示したり、入力された値を攻撃者へ送ったりできる
  • ページは自社のサーバから届き、アドレス欄のドメインも本物なので、URLの確認では見抜けない

IPAの「安全なウェブサイトの作り方」は、ページに出力するすべての値をエスケープすることを 根本的解決としています。被害は自社のサーバではなく、ページを閲覧した利用者に及びます。

混同しやすいものとの違い

原因 起きる攻撃 被害の出方
出力時のエスケープ漏れ クロスサイトスクリプティング 本物のページ内でスクリプトが動く
SQL文の文字列連結 SQLインジェクション データベースの内容が読まれる
暗号化しない通信 盗聴 通信経路で中身を盗み見られる
キャッシュDNSの汚染 DNSキャッシュポイズニング 正しい名前で偽のサーバへ誘導される

「ドメインは本物」「URLに入力値としてスクリプトがある」の2つがそろえば、出力のエスケープ漏れを疑います。

前の問題へ次の問題へ