基本情報技術者 2016年 春期 午前(科目A) 問37
問題文
SQLインジェクション攻撃の説明として、適切なものはどれか。
選択肢
ア:Webアプリケーションのデータ操作言語の呼出し方に不備がある場合に、攻撃者が悪意をもって構成した文字列を入力することによって、データベースのデータの不正な取得、改ざん及び削除をする攻撃(正解)
イ:Webサイトに対して、他のサイトを介して大量のパケットを送り付け、そのネットワークトラフィックを異常に高めてサービスを提供不能にする攻撃
ウ:確保されているメモリ空間の下限又は上限を超えてデータの書込みと読出しを行うことによって、プログラムを異常終了させたりデータエリアに挿入された不正なコードを実行させたりする攻撃
エ:攻撃者が罠を仕掛けたWebページを利用者が閲覧し、当該ページ内のリンクをクリックしたときに、不正スクリプトを含む文字列が脆弱なWebサーバに送り込まれ、レスポンスに埋め込まれた不正スクリプトの実行によって、情報漏えいをもたらす攻撃
🔒 解説は解答すると表示されます
SQLインジェクション攻撃【午前解説】
正解の理由
正解は ア です。
アは「Webアプリケーションがデータ操作言語(SQLなど)の呼び出し方法に不備があり、攻撃者が構成した文字列を入力してデータベースを不正操作する」と明確にSQLインジェクションの定義を述べています。SQLインジェクションは「入力値がSQL文に直接反映され、意図しないSQLが実行される」点が本質であり、アがそれを正確に表しています。
アは「Webアプリケーションがデータ操作言語(SQLなど)の呼び出し方法に不備があり、攻撃者が構成した文字列を入力してデータベースを不正操作する」と明確にSQLインジェクションの定義を述べています。SQLインジェクションは「入力値がSQL文に直接反映され、意図しないSQLが実行される」点が本質であり、アがそれを正確に表しています。
解法ステップ
- 設問文のキーワードを拾う:今回は「データ操作言語」「構成した文字列」「不正取得・改ざん・削除」。
- 各選択肢がどの攻撃手法を説明しているか対応づける(DDoS、バッファオーバーフロー、XSS等)。
- その中でDB操作に関係し、入力を介して任意のSQLが実行される説明を選ぶ。
- 被害(取得・改ざん・削除)の記述がある選択肢を重視する。
- 最終確認として他選択肢が別攻撃(ネットワーク攻撃、メモリ破壊、スクリプト実行)を説明していないか確認する。
選択肢別の誤答解説
- ア(正解):DBに対する不正な取得・改ざん・削除を、攻撃者が構成した入力で引き起こす点を正しく説明しています。
- イ:大量パケットでネットワークトラフィックを上げサービス不能にする説明で、DDoS(DoS)攻撃の説明です。SQLインジェクションとは別物です。
- ウ:メモリ領域の境界を超えた書込み・読出しでプログラムを異常終了させたり不正コードを実行させる説明はバッファオーバーフロー(メモリ破壊)攻撃です。
- エ:攻撃者が仕掛けたページで不正スクリプトが実行され情報漏えいを起こす説明はクロスサイトスクリプティング(XSS)で、ブラウザ側でのスクリプト実行が問題になります。
よくある誤解
- 「SQLインジェクション=クロスサイトスクリプティング(XSS)」と混同する人が多いですが、SQLiはDB操作を対象、XSSはブラウザ上でのスクリプト実行が対象です。
- 「認証済みでないと実行できない」と思い込む誤解。多くのSQLiは認証前でも攻撃可能で、公開フォームや検索窓から狙われます。
- 「単にエスケープすれば安全」も誤りで、エスケープ方法を間違うと抜け道が残りやすく、プレペアド文やパラメータ化が推奨されます。
補足コラム
対策の基本は「入力の信頼しない」「パラメータ化」「最小権限」です。実務では以下を組み合わせます。
- プレペアドステートメント/パラメータ化クエリを使用してSQL文とデータを分離する。
- 入力はホワイトリスト検証(許容値のみ許可)を優先し、不要なエラーメッセージは出さない。
- DB接続ユーザに最小権限を付与し、不要な更新・削除権限を与えない。
- WAFやIDSでパターン検出・ログ監視を行う。
例:Python(sqlite3)での安全なクエリ例
import sqlite3
conn = sqlite3.connect('example.db')
cur = conn.cursor()
# ユーザ入力を直接SQL文字列に連結しない
cur.execute("SELECT * FROM users WHERE name = ?", (user_input,))
rows = cur.fetchall()
攻撃の種類としては、エラー型、ブール/タイムベースのブラインド、ユニオン型などがあり、検出方法や影響範囲が異なります。
FAQ
Q: エスケープ処理だけでは不十分ですか?
A: 場合によりますが、エスケープは実装ミスやDB仕様差で脆弱になりやすいため、プレペアド文やパラメータ化を優先すべきです。
A: 場合によりますが、エスケープは実装ミスやDB仕様差で脆弱になりやすいため、プレペアド文やパラメータ化を優先すべきです。
Q: SQLインジェクションは認証済みのユーザだけが行える?
A: いいえ。公開フォームや検索欄など認証不要の入力欄からでも攻撃が可能です。
A: いいえ。公開フォームや検索欄など認証不要の入力欄からでも攻撃が可能です。
Q: ORMを使えば安全になりますか?
A: ORMは多くの場合パラメータ化クエリを使うため安全性は高まりますが、生SQLの挿入や不適切なフィルタリングで脆弱になる場合があります。
A: ORMは多くの場合パラメータ化クエリを使うため安全性は高まりますが、生SQLの挿入や不適切なフィルタリングで脆弱になる場合があります。
Q: テスト環境での検査方法は?
A: ペネトレーションテストや専用ツール(SQLMapなど)で検出できますが、テストは必ず許可を得た環境で行ってください。
A: ペネトレーションテストや専用ツール(SQLMapなど)で検出できますが、テストは必ず許可を得た環境で行ってください。
関連キーワード: SQLインジェクション、パラメータ化クエリ、プレペアドステートメント、XSS、バッファオーバーフロー、DDoS、WAF、入力検証、最小権限、攻撃手法解析

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

