正解:イ
各選択肢の解説
アクロスサイトスクリプティング
誤り。入力欄に仕込んだ文字列が、そのサイトを閲覧した別の利用者のブラウザで スクリプトとして動く攻撃です。入力欄を悪用する点は同じですが、 仕込んだ命令が動く場所は利用者のブラウザで、データベースではありません。
イSQLインジェクション
正解。入力された文字列をデータの一部としてではなく、データベースへの 命令の一部として組み立ててしまう不備を突いた攻撃です。 結果として、開発者が想定していない問合せがそのまま実行されます。
ウディレクトリトラバーサル
誤り。ファイル名を指定する入力に「一つ上の階層へ」を意味する記述を混ぜ、 公開範囲の外にあるファイルを読み出す攻撃です。見えないはずの情報を 引き出す点は同じでも、取り出す先はデータベースではなくサーバ上のファイルです。
エ総当たり攻撃(ブルートフォース攻撃)
誤り。パスワードとして考えられる文字の組合せを片端から試し、 ログインを突破する攻撃です。入力欄に大量の文字列を打ち込む姿は似ていますが、 狙うのは認証の突破であって、アプリケーションの作りの不備ではありません。
理解を深めるために
書き込んだ「文字」が「命令」として読まれる
伝言メモに「○○さんへ電話して」と書くつもりが、そのメモの文字が そのまま業務の指示書に貼り付けられ、書いた内容が命令として実行されてしまう。 SQLインジェクションで起きているのはこれです。 検索欄に入れた文字は、本来は探す言葉というデータとして扱われるはずでした。 ところがアプリケーションが、受け取った文字列を切り分けずに問合せ文へ つなげて組み立てていると、その文字が命令の続きとして解釈されます。
何ができてしまうのか
- 条件を常に成立させる記述を混ぜ込み、会員全員の情報を取り出す
- 利用者IDだけを入力してパスワードの確認をすり抜け、他人になりすます
- データの書き換えや削除まで実行される
入力欄に見えるものだけが入口ではありません。画面に出ない項目や アドレス欄の値など、利用者側から送られる値はすべて対象になります。 対策は、入力された値を命令として解釈されない形に扱う作り(入力値の確認や、 値を埋め込む場所をあらかじめ決めておく書き方)にすることです。
混同しやすいものとの違い
| 用語 | どこに、何を送り込むか |
|---|---|
| SQLインジェクション | サーバのデータベースへ、命令として解釈される文字列 |
| クロスサイトスクリプティング | 他の利用者のブラウザへ、実行されるスクリプト |
| ディレクトリトラバーサル | サーバのファイルへ、公開範囲の外を指す記述 |
| 総当たり攻撃 | ログイン画面へ、考えられるパスワードの全組合せ |
「データベース」「問合せ」「会員情報が引き出された」という語が並んだら SQLインジェクションです。命令が動く場所がサーバ側かブラウザ側かで、 クロスサイトスクリプティングと切り分けます。