基本情報技術者 2017年 秋期 午前(科目A) 問39
問題文
SQLインジェクション攻撃の説明はどれか。
選択肢
ア:Webアプリケーションに問題があるとき、悪意のある問合せや操作を行う命令文をWebサイトに入力して、データベースのデータを不正に取得したり改ざんしたりする攻撃(正解)
イ:悪意のあるスクリプトを埋め込んだWebページを訪問者に閲覧させて、別のWebサイトで、その訪問者が意図しない操作を行わせる攻撃
ウ:市販されているDBMSの脆弱性を悪用することによって、宿主となるデータベースサーバを探して感染を繰り返し、インターネットのトラフィックを急増させる攻撃
エ:訪問者の入力データをそのまま画面に表示するWebサイトを悪用して、悪意のあるスクリプトを訪問者のWebブラウザで実行させる攻撃
SQLインジェクション攻撃の説明はどれか【午前2 解説】
要点まとめ
- 結論: SQLインジェクションは、Web入力欄やURLに不正なSQL文を注入してDBのデータを不正取得・改ざん・削除する攻撃手法です。
- 根拠: 設問文の「問合せや操作を行う命令文をWebサイトに入力して、データベースのデータを不正に取得したり改ざんしたりする」という記述がまさにSQL文注入を指します。
- 差がつくポイント: XSSやCSRFと混同しないこと。SQLiは「DBへ送る命令文を注入するか否か」を基準に見分けると確実です。
正解の理由
正解は ア です。アは「Webアプリケーションの入力箇所に悪意のある問合せや操作を行う命令文(=SQL文)を入力して、データベースのデータを不正に取得・改ざんする攻撃」と明確に説明しており、SQLインジェクションの定義に一致します。SQLインジェクションは、入力値をそのままSQLに連結して実行する実装ミスを突き、例えば "' OR '1'='1" や "UNION SELECT ..." 等のペイロードで認証回避やデータ抽出を行います。
よくある誤解
- 「スクリプト実行=すべてXSS」と誤認する受験者が多く、画面上でスクリプトを走らせる攻撃(XSS)とDBに命令文を注入する攻撃(SQLi)を混同しやすい点。
- SQLインジェクションは「データの閲覧だけ」の攻撃と考えがちだが、改ざん・削除やサーバ側でコマンド実行に繋がるケースもあるため軽視してはいけません。
- 「GETだけで起きる」と思い込む誤解。POSTやヘッダ、Cookie、JSONボディ等あらゆる入力箇所が対象になります。
解法ステップ
- 設問文のキーワードを探す:「データベース」「問合せや操作を行う命令文」「入力して」「不正に取得」「改ざん」などを確認。
- 攻撃分類と照合する:DBへ命令文を注入するか(SQLi)、別サイトで操作を強制するか(CSRF)、ブラウザでスクリプトを実行させるか(XSS)で判定。
- 選択肢を絞る:DB操作が明示されている選択肢を正解とする。その他は用語(XSS/CSRF/ワーム等)と照らして除外。
選択肢別の誤答解説
- ア: 正解。Web入力にSQL文を注入してDBを不正操作するという説明はSQLインジェクションそのものです。
- イ: 誤り。別サイトで訪問者に意図しない操作を行わせる攻撃はCSRF(Cross-Site Request Forgery)です。悪意のあるスクリプトを埋め込む点があるが、CSRFは通常ユーザの認証情報を利用して「別サイトへリクエストを強制する」攻撃です。
- ウ: 誤り。市販DBMSの脆弱性を悪用して感染を広げトラフィックを増やすのはワームやボットネットの振る舞いで、SQLインジェクションの説明ではありません。
- エ: 誤り。訪問者のブラウザで悪意あるスクリプトを実行させる攻撃はXSS(Cross-Site Scripting)であり、DBへの命令注入を特徴とするSQLiとは異なります。
補足コラム
防御策の基本は入力の扱い方を変えることです。代表的対策は以下の通りです。
- プリペアドステートメント・パラメータ化クエリを利用してSQLとデータを分離する。
- 入力のホワイトリスト検証(型や長さ、許可文字のみ通す)。
- 最小権限のDBアカウントを使い、不要な権限は与えない。
- エラーメッセージに内部情報を出さない。ログ監視やWAFで異常なクエリを検出する。
簡単なコード例(悪い例と良い例、Python sqlite3):
# 悪い例:文字列連結でクエリを作る(SQLインジェクション脆弱) user = "alice' OR '1'='1" query = "SELECT * FROM users WHERE username = '" + user + "';" cursor.execute(query) # 良い例:パラメータ化クエリ(安全) user = "alice' OR '1'='1" query = "SELECT * FROM users WHERE username = ?;" cursor.execute(query, (user,))
FAQ
Q1: SQLインジェクションとXSSの違いは何ですか?
A1: SQLiは「データベースに送る命令文を注入」してサーバ側データを不正操作する攻撃、XSSは「ユーザのブラウザ上でスクリプトを実行」させる攻撃であり、対象(DBかブラウザか)が異なります。
A1: SQLiは「データベースに送る命令文を注入」してサーバ側データを不正操作する攻撃、XSSは「ユーザのブラウザ上でスクリプトを実行」させる攻撃であり、対象(DBかブラウザか)が異なります。
Q2: SQLインジェクションの種類にはどんなものがありますか?
A2: 主にエラーベース、ブラインド(タイムベースやブールベース)、UNIONベースなどがあり、攻撃手法や情報取得の方法が異なります。
A2: 主にエラーベース、ブラインド(タイムベースやブールベース)、UNIONベースなどがあり、攻撃手法や情報取得の方法が異なります。
Q3: テストはどう行えば安全ですか?
A3: 権限を得た環境でのみ実施します。実運用DBを直接攻撃してはいけません。テスト用データベースと適切な承認プロセスを用意してください。
A3: 権限を得た環境でのみ実施します。実運用DBを直接攻撃してはいけません。テスト用データベースと適切な承認プロセスを用意してください。
Q4: WAFだけで完全に防げますか?
A4: WAFは有効な補助ですが、完全ではありません。安全なコーディング(パラメータ化)と権限管理が第一です。
A4: WAFは有効な補助ですが、完全ではありません。安全なコーディング(パラメータ化)と権限管理が第一です。
関連キーワード: SQLインジェクション、XSS、CSRF、プリペアドステートメント、パラメータ化クエリ、OWASP、入力検証、WAF、データベースセキュリティ、インジェクション攻撃

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

