基本情報技術者 2012年 秋期 午前(科目A) 問40
問題文
SQLインジェクションの説明はどれか。
選択肢
ア:Webアプリケーションに問題があるとき、データベースに悪意のある問合せや操作を行う命令文を入力して、データベースのデータを改ざんしたり不正に取得したりする攻撃(正解)
イ:悪意のあるスクリプトを埋め込んだWebページを訪問者に閲覧させて、別のWebサイトで、その訪問者が意図しない操作を行わせる攻撃
ウ:市販されているDBMSの脆弱性を利用することによって、宿主となるデータベースサーバを探して自己伝染を繰り返し、インターネットのトラフィックを急増させる攻撃
エ:訪問者の入力データをそのまま画面に表示するWebサイトに対して、悪意のあるスクリプトを埋め込んだ入力データを送ることによって、訪問者のブラウザで実行させる攻撃
SQLインジェクションの説明はどれか。【午前2 解説】
要点まとめ
- 結論: SQLインジェクションはユーザ入力に悪意あるSQL文を挿入してDBのデータを改ざん・不正取得する攻撃です。
- 根拠: 問題文のアは「データベースに悪意のある問合せや操作を行う命令文を入力」と明確にDB操作を攻撃対象としています。
- 差がつくポイント: XSSやCSRFと混同しやすいので「ターゲットがDBかブラウザか」を見分けて解答することが重要です。
正解の理由
正解: アはア
アは「データベースに悪意のある問合せや操作を行う命令文を入力して、データベースのデータを改ざんしたり不正に取得したりする攻撃」と記述しており、SQLインジェクションの定義に合致します。SQLインジェクションはアプリケーションが受け取った入力をそのままSQL文に組み込む設計や実装の欠陥を突き、攻撃者が任意のSQLを実行させることでデータの閲覧・改竄・削除や認証バイパスなどを行う攻撃手法です。
アは「データベースに悪意のある問合せや操作を行う命令文を入力して、データベースのデータを改ざんしたり不正に取得したりする攻撃」と記述しており、SQLインジェクションの定義に合致します。SQLインジェクションはアプリケーションが受け取った入力をそのままSQL文に組み込む設計や実装の欠陥を突き、攻撃者が任意のSQLを実行させることでデータの閲覧・改竄・削除や認証バイパスなどを行う攻撃手法です。
よくある誤解
- XSSと混同する: XSSは主にブラウザ上でスクリプトを実行させる攻撃で、ターゲットが「ユーザのブラウザ」です。DBへの直接攻撃ではありません。
- CSRFと勘違いする: CSRFは利用者の認証済みセッションを悪用して別サイト上で不正操作をさせるもので、攻撃経路が異なります。
- 「DBの脆弱性を使って自己伝染する」はワーム等の挙動であり、SQLインジェクションの説明ではありません。
解法ステップ
- 各選択肢の主語・目的語を確認し、攻撃対象が「データベースかブラウザか他のサーバか」を判別する。
- 「問合せ」「SQL」「データベース」「取得」「改ざん」といったキーワードを含む選択肢を優先して検討する。
- 残った選択肢をXSS(ブラウザ上でスクリプト実行)やCSRF(ユーザ認証を悪用したリクエスト)など既知の攻撃と照合して除外する。
選択肢別の誤答解説
- ア: 正解。DBに対して悪意ある問い合わせや操作を行わせる説明で、SQLインジェクションそのものを表現しています。
- イ: 説明は「別のWebサイトで訪問者が意図しない操作を行わせる」とあり、これはCSRF(クロスサイトリクエストフォージェリ)に該当します。XSSの要素を含む記述と混ざっているが主旨はCSRFです。
- ウ: 「DBMSの脆弱性を利用して自己伝染を繰り返す」とあり、ワームやウイルスの挙動を述べておりSQLインジェクションの説明ではありません。
- エ: 「入力データをそのまま画面に表示してブラウザで実行させる」とあるため、これはXSS(クロスサイトスクリプティング)の説明です。
補足コラム
主なSQLインジェクションの種類と対策を簡潔に整理します。種類には、(1)インバンド(エラー/UNIONベース)、(2)ブラインド(ブール/時間差)、(3)アウトオブバンドがあります。対策は代表的に以下が効果的です:パラメータ化クエリ(プリペアドステートメント)、ORマッピングやエスケープの適切な使用、ホワイトリストによる入力検証、DBユーザの最小権限化、エラーメッセージの抑制など。
安全なクエリ例(Python + sqlite3)
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
# 悪い例: 文字列連結でSQLを作るとSQLインジェクションの危険
username = "' OR '1'='1"
sql_bad = "SELECT * FROM users WHERE username = '%s';" % username
# 良い例: パラメータ化クエリを使う
sql_good = "SELECT * FROM users WHERE username = ?;"
cur.execute(sql_good, (username,))
rows = cur.fetchall()
FAQ
Q: SQLインジェクションとXSSはどう見分ければいいですか?
A: ターゲットが「データベースの操作や問合せか(SQLi)」か「ブラウザ上でスクリプトを実行させるか(XSS)」で区別します。説明にDB操作の文言があればSQLiです。
A: ターゲットが「データベースの操作や問合せか(SQLi)」か「ブラウザ上でスクリプトを実行させるか(XSS)」で区別します。説明にDB操作の文言があればSQLiです。
Q: 入力をエスケープすれば必ず防げますか?
A: エスケープは一部のケースで効果がありますが、確実な対策はパラメータ化クエリ等でプレースホルダを用いることです。不完全なエスケープは脆弱性を残します。
A: エスケープは一部のケースで効果がありますが、確実な対策はパラメータ化クエリ等でプレースホルダを用いることです。不完全なエスケープは脆弱性を残します。
Q: ORマッピング(ORM)を使えば安全ですか?
A: ORMは多くの攻撃を防ぐ助けになりますが、原則はパラメータ化されたAPIを正しく使うこと。生SQLを組み立てる場合は依然として注意が必要です。
A: ORMは多くの攻撃を防ぐ助けになりますが、原則はパラメータ化されたAPIを正しく使うこと。生SQLを組み立てる場合は依然として注意が必要です。
関連キーワード: SQLインジェクション、XSS、CSRF、パラメータ化クエリ、プリペアドステートメント、入力検証、OWASP、データベースセキュリティ、ブラインドSQLインジェクション

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

