基本情報技術者 2015年 春期 午前(科目A) 問42
問題文
SQLインジェクション攻撃の説明はどれか。
選択肢
ア:Webアプリケーションに問題があるとき、悪意のある問合せや操作を行う命令文を入力して、データベースのデータを不正に取得したり改ざんしたりする攻撃(正解)
イ:悪意のあるスクリプトを埋め込んだWebページを訪問者に閲覧させて、別のWebサイトで、その訪問者が意図しない操作を行わせる攻撃
ウ:市販されているDBMSの脆弱性を利用することによって、宿主となるデータベースサーバを探して自己伝染を繰り返し、インターネットのトラフィックを急増させる攻撃
エ:訪問者の入力データをそのまま画面に表示するWebサイトに対して、悪意のあるスクリプトを埋め込んだ入力データを送ることによって、訪問者のブラウザで実行させる攻撃
🔒 解説は解答すると表示されます
SQLインジェクション攻撃【午前解説】
正解の理由
正解: ア
選択肢アは「悪意のある問合せや操作を行う命令文を入力して、データベースのデータを不正に取得したり改ざんしたりする攻撃」と明確に記述しており、これはSQLインジェクションの定義そのものです。SQLインジェクションはアプリケーションが入力をそのままSQL文に組み込むことで発生し、機密情報の流出やデータ改ざん、場合によってはOSレベルの侵害に発展します。
選択肢アは「悪意のある問合せや操作を行う命令文を入力して、データベースのデータを不正に取得したり改ざんしたりする攻撃」と明確に記述しており、これはSQLインジェクションの定義そのものです。SQLインジェクションはアプリケーションが入力をそのままSQL文に組み込むことで発生し、機密情報の流出やデータ改ざん、場合によってはOSレベルの侵害に発展します。
解法ステップ
- 問題文のキーワードを確認:「データベース」「問合せ」「命令文」「不正に取得・改ざん」などがSQLインジェクションの指標です。
- 各選択肢の攻撃対象と手法を比較:ブラウザ上でスクリプトが実行されるか、別サイトへのリクエストを強制するか、データベースに直接命令を送るかを見分けます。
- SQLインジェクションは「入力によりSQL文の意味を変える」攻撃であることを基準に選びます。
選択肢別の誤答解説
- ア: 正解。Webアプリの入力を通じて不正なSQL文を注入し、データベースを不正操作する攻撃であり、定義に合致します。
- イ: 不正なスクリプトを埋めたページで訪問者が別サイトで意図しない操作を起こす、これはCSRF(クロスサイトリクエストフォージェリ)やスクリプト誘導を示す説明であり、SQLインジェクションではありません。
- ウ: 市販DBMSの脆弱性を利用して自己伝染するのはワームや自動伝播マルウェアの説明で、SQL文注入とは別の脅威です。
- エ: 訪問者の入力データをそのまま表示してブラウザで悪意あるスクリプトを実行させるのはXSS(クロスサイトスクリプティング)の説明で、SQLインジェクションとは手法も影響範囲も異なります。
よくある誤解
- 「スクリプトを埋め込む=SQLインジェクション」と混同する誤解。スクリプト埋め込みはXSS(クロスサイトスクリプティング)に該当します。
- 「SQLインジェクションは読むだけの被害に限られる」と考える誤解。データの改ざんや管理者権限取得、サービス停止へ拡大することがあります。
- 「クライアント側での入力チェックだけで十分」と考える誤解。必ずサーバ側での厳格な検証やパラメータ化が必要です。
補足コラム
SQLインジェクションの対策は組み合わせが重要です。代表的な防御策は以下です。
- パラメータ化クエリ(プレースホルダ)/プリペアドステートメントを常用する。
- 入力のホワイトリスト検証と長さ・型チェックを行う。
- DB接続に最小権限のアカウントを使用する(SELECTだけで良いならINSERT/UPDATE権限を与えない)。
- 詳細なエラーメッセージは出力しない、ログは監視する。
- WAF(Web Application Firewall)や静的解析・動的解析で脆弱箇所を検出する。
例:Python(sqlite3)でのパラメータ化クエリ
import sqlite3
conn = sqlite3.connect('example.db')
cur = conn.cursor()
# 悪い例(文字列連結でSQL文を組み立てると注入される)
# cur.execute("SELECT * FROM users WHERE name = '%s'" % user_input)
# 良い例(パラメータ化)
cur.execute("SELECT * FROM users WHERE name = ?", (user_input,))
rows = cur.fetchall()
FAQ
Q: SQLインジェクションとXSSの見分け方は?
A: SQLiはサーバ側でデータベースに対する不正な問い合わせを行いデータを盗む・改ざんする攻撃です。XSSはブラウザ上でスクリプトを実行させて情報窃取や操作をさせる攻撃で、攻撃対象が異なります。
A: SQLiはサーバ側でデータベースに対する不正な問い合わせを行いデータを盗む・改ざんする攻撃です。XSSはブラウザ上でスクリプトを実行させて情報窃取や操作をさせる攻撃で、攻撃対象が異なります。
Q: パラメータ化クエリだけで完全に防げますか?
A: パラメータ化クエリは非常に有効ですが、入力検証、適切な権限設定、エラーメッセージ管理などと併用することが必要です。
A: パラメータ化クエリは非常に有効ですが、入力検証、適切な権限設定、エラーメッセージ管理などと併用することが必要です。
Q: ペネトレーションテストでの検査方法は?
A: 入力箇所に特殊文字(' "-- ;)や論理式(OR 1=1)を含める、ブラインドSQLiではタイムベースやブールベースのテストを行います。ただし実施は必ず許可を得て行ってください。
A: 入力箇所に特殊文字(' "-- ;)や論理式(OR 1=1)を含める、ブラインドSQLiではタイムベースやブールベースのテストを行います。ただし実施は必ず許可を得て行ってください。
関連キーワード: SQLインジェクション、クロスサイトスクリプティング、CSRF、入力検証、パラメータ化クエリ、プレースホルダ、WAF、DBMS、脆弱性、プリペアドステートメント, OWASP

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

