情報セキュリティ

基本情報技術者試験SQLインジェクション」の問題

情報セキュリティ情報セキュリティ難易度:hard
あるWebアプリのログイン処理は、入力されたIDとパスワードを文字列としてSQL文に連結し『該当行が1件以上あれば認証成功』としている。診断で、パスワード欄に特定の文字列を入れるとパスワードを知らなくてもログインできてしまうと指摘された。開発標準でプレースホルダの全面利用が難しい既存箇所に、暫定でなく可能な範囲で確実性の高い対策を施すとき、最も適切なものはどれか。
構文をあらかじめ確定させた後に、入力値だけをバインド機構で渡す呼び出しに改める。
画面側の入力欄で記号を含む値をその場で弾き、英数字以外を送信できないよう制御を加える。
同一IPからのログイン失敗が一定回数を超えた時点で以後の接続を遮断し、不正な試行の継続を止める。
認証後に発行する識別子の有効期限を短く取り、万一奪われた場合に悪用できる時間を狭める。
正解
構文をあらかじめ確定させた後に、入力値だけをバインド機構で渡す呼び出しに改める。

認証回避の原因は、入力をSQL構文に直接連結してデータと命令が混同される点にある。構文を先に確定させ、入力はバインド機構(プレースホルダ)で値としてのみ渡せば、特殊文字を含む入力もSQLの構文には影響せず、条件を常に真にするような注入が成立しなくなる。既存箇所でも該当処理を書き換えれば確実に効く根本対策である。

?選択肢ごとの解説

ア ○認証回避の原因は、入力をSQL構文に直接連結してデータと命令が混同される点にある。構文を先に確定させ、入力はバインド機構(プレースホルダ)で値としてのみ渡せば、特殊文字を含む入力もSQLの構文には影響せず、条件を常に真にするような注入が成立しなくなる。既存箇所でも該当処理を書き換えれば確実に効く根本対策である。
イ ×画面側の文字制限はブラウザの改変や直接の通信送信で容易に回避され、サーバ側で連結している限り注入は成立するため根本対策にならない。
ウ ×IPアドレス遮断は総当たりのような多数失敗を伴う攻撃に効くが、一回の特殊文字列で認証を回避する本問の手口は失敗を伴わず発動しない。
エ ×識別子の有効期限短縮は認証後の悪用時間を狭めるだけで、認証そのものを回避させてしまう入力連結の問題を解消しない。

くわしく

SQLインジェクションは『データと命令の混同』が本質であり、認証回避はその典型的な悪用形態である。クライアント側の入力制限は利便性向上には役立つが信頼境界の外であり、サーバ側でのプレースホルダによる構文と値の構造的分離こそが確実な防御線となる。

本番での押さえどころ

試験のコツ

『パスワードを知らなくてもログインできる』はSQLインジェクションによる認証回避のサイン。対策はプレースホルダによる値と構文の分離。

覚え方

ログイン文も『値は箱に入れて渡す』。箱(プレースホルダ)に入れた入力は鍵(構文)をいじれない。

よくある誤り

画面側の入力制限やログイン試行の回数制御で防げると考えがちだが、これらは迂回可能か別手口向けであり、サーバ側の構文分離でなければ認証回避は止まらない。

情報セキュリティの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-sec-0097

【基本情報技術者試験】SQLインジェクションの問題 — 解答・解説|ukamiru 過去問