問題 23★★☆

会員制Webサイトの検索欄に細工した文字列を入力されたところ、 その文字列がデータベースへの問合せ文の一部として実行され、 本来は表示されない他の会員の情報まで取り出された。この攻撃はどれか。

正解:イ

各選択肢の解説

  1. アクロスサイトスクリプティング

    誤り。入力欄に仕込んだ文字列が、そのサイトを閲覧した別の利用者のブラウザで スクリプトとして動く攻撃です。入力欄を悪用する点は同じですが、 仕込んだ命令が動く場所は利用者のブラウザで、データベースではありません。

  2. イSQLインジェクション

    正解。入力された文字列をデータの一部としてではなく、データベースへの 命令の一部として組み立ててしまう不備を突いた攻撃です。 結果として、開発者が想定していない問合せがそのまま実行されます。

  3. ウディレクトリトラバーサル

    誤り。ファイル名を指定する入力に「一つ上の階層へ」を意味する記述を混ぜ、 公開範囲の外にあるファイルを読み出す攻撃です。見えないはずの情報を 引き出す点は同じでも、取り出す先はデータベースではなくサーバ上のファイルです。

  4. エ総当たり攻撃(ブルートフォース攻撃)

    誤り。パスワードとして考えられる文字の組合せを片端から試し、 ログインを突破する攻撃です。入力欄に大量の文字列を打ち込む姿は似ていますが、 狙うのは認証の突破であって、アプリケーションの作りの不備ではありません。

理解を深めるために

書き込んだ「文字」が「命令」として読まれる

伝言メモに「○○さんへ電話して」と書くつもりが、そのメモの文字が そのまま業務の指示書に貼り付けられ、書いた内容が命令として実行されてしまう。 SQLインジェクションで起きているのはこれです。 検索欄に入れた文字は、本来は探す言葉というデータとして扱われるはずでした。 ところがアプリケーションが、受け取った文字列を切り分けずに問合せ文へ つなげて組み立てていると、その文字が命令の続きとして解釈されます。

何ができてしまうのか

  • 条件を常に成立させる記述を混ぜ込み、会員全員の情報を取り出す
  • 利用者IDだけを入力してパスワードの確認をすり抜け、他人になりすます
  • データの書き換えや削除まで実行される

入力欄に見えるものだけが入口ではありません。画面に出ない項目や アドレス欄の値など、利用者側から送られる値はすべて対象になります。 対策は、入力された値を命令として解釈されない形に扱う作り(入力値の確認や、 値を埋め込む場所をあらかじめ決めておく書き方)にすることです。

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

用語 どこに、何を送り込むか
SQLインジェクション サーバのデータベースへ、命令として解釈される文字列
クロスサイトスクリプティング 他の利用者のブラウザへ、実行されるスクリプト
ディレクトリトラバーサル サーバのファイルへ、公開範囲の外を指す記述
総当たり攻撃 ログイン画面へ、考えられるパスワードの全組合せ

「データベース」「問合せ」「会員情報が引き出された」という語が並んだら SQLインジェクションです。命令が動く場所がサーバ側かブラウザ側かで、 クロスサイトスクリプティングと切り分けます。

前の問題へ次の問題へ