SQLインジェクションとは?種類と対策

公開: 更新: カテゴリ: セキュリティ系

30秒で結論

SQLインジェクションとは(全体像)

Webアプリの多くは、入力された内容を使ってデータベースに命令(SQL)を出す。たとえば「この名前の利用者を探して」のように。

ところが、入力をそのまま命令に混ぜてしまうと、攻撃者が入力欄に「命令の続き」を書き込むことで、本来見えないデータを取り出したり書き換えたりできてしまう。これがSQLインジェクション。典型例は `' OR '1'='1` のような入力だ。

押さえるのは、根本の対策(プレースホルダ)と、5種類の手口だ。


詳しく:種類と対策を押さえる

ここが心臓部。まず手口の5種類を整理する(名前と「どう情報を取るか」をつかめば十分)。

SQLインジェクションの5種類

種類どう情報を取るか
UNION(Classic)UNION文で別のテーブルの情報をくっつけて取り出す
Errorわざとエラーを起こし、エラーメッセージから情報を漏らす
Blind Boolean応答の正否(True/False)の違いから1つずつ推測する
Blind Time応答時間の差(SLEEPなど)から推測する
Out-of-BandDNSやHTTPなど別の通り道で情報を取り出す

そして、対策の優先順位がよく問われる。

SQLインジェクションの対策

対策位置づけ
プレースホルダ(パラメータ化)最重要・根本対策。入力を「データ」として扱い、命令にしない
エスケープ危ない文字を無害化する補助的な対策
WAF入口で怪しい入力をふるい落とす。ただし単独では不十分

言葉を噛み砕いておく。

わかりやすく言い換えると

つまり、SQLインジェクションは「注文票に、裏の命令をこっそり書き込む」攻撃にたとえるとスッと入る。

レストランで、料理名の欄に「ステーキ。ついでに金庫を開けて」と書いたとする。もし店員(プログラム)が、書かれた文をそのまま命令として実行してしまえば、金庫が開いてしまう。SQLiは、入力を命令として解釈させてしまう隙を突く攻撃だ。

これを根本から防ぐのがプレースホルダ。「料理名の欄は、必ず料理名としてだけ扱う」と先に決めておけば、何を書かれても命令にはならない。エスケープ(危ない文字を無害化)やWAF(門番)は補助で、プレースホルダと重ねて使うのが安心、というわけだ。


試験のツボ

🔴 一番出る:最重要の対策はプレースホルダ

①プレースホルダ=入力をデータとして扱い、命令にしない(根本対策)

②エスケープは補助・WAFは単独では不十分(多層防御)

🔴 次に出る:5種類の手口

①UNION・Error・Blind Boolean・Blind Time・Out-of-Band

②応答の正否や時間差から推測するのがBlind系

🟡 押さえると安定:SQLiは入力を命令として実行させる攻撃でOWASPのA03。典型例は「' OR '1'='1」


よくある間違い

「SQLインジェクション対策はエスケープだけで十分」→ ✗  最優先はプレースホルダ。エスケープは補助で、それだけでは不十分。

「WAFを入れれば単独で完全に防げる」→ ✗  WAFは入口の門番。プレースホルダなどと重ねる多層防御が必要。

「SQLインジェクションは通信を暗号化する技術のこと」→ ✗  暗号化ではなく、入力から悪意のSQLを注入する攻撃のこと。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(SQLインジェクションとは)

📝 オリジナル問題 1 SQLインジェクションとは

SQLインジェクションに関する次の記述のうち、正しいものはどれか。

  1. SQLインジェクションは通信を暗号化するための技術で、攻撃とは無関係のしくみであるとされているのだ
  2. SQLインジェクションはサーバの電源を物理的に切り替える作業のことで、入力とはいっさい関係しないとされている
  3. SQLインジェクションは画面を見やすく拡大するための表示の補助技術にすぎないとされているのだ
  4. SQLインジェクションは入力欄から悪意のあるSQLを注入し、データを盗んだり書き換えたりする攻撃である
ピーエムロボ
ピーエムロボ 解答・解説

解答は 4 である。

SQLインジェクションは、入力欄から悪意のあるSQL(データベースへの命令)を注入する攻撃。入力を命令として実行させ、データを盗んだり書き換えたりする。OWASPのA03にあたる。

選択肢1の暗号化、選択肢2の電源切り替え、選択肢3の画面拡大は、いずれも誤りだ。

選択肢判定理由
1暗号化技術ではなく攻撃
2電源切り替えとは無関係
3画面拡大の技術ではない
4入力から悪意のSQLを注入する攻撃で正しい

オリジナル問題2(最重要の対策)

📝 オリジナル問題 2 最重要の対策

SQLインジェクションの対策に関する次の記述のうち、正しいものはどれか。

  1. 最重要の対策はプレースホルダで、入力を値として扱い命令としては実行させないことが根本の対策である
  2. 最重要の対策は通信の暗号化だけで、入力を命令として実行させない工夫はいっさい不要とされているのだ
  3. 対策は不要で、入力された内容はそのまま命令として実行しても問題は起きないとされているのが実情である
  4. 最重要の対策は画面の文字を大きくすることで、入力の扱い方とはまったく関係がないとされているものだ
ピーエムロボ
ピーエムロボ 解答・解説

解答は 1 だ。

最重要の対策はプレースホルダ(パラメータ化)。入力を「値(データ)」として扱い、命令として実行させないことが根本の対策になる。

選択肢2は「暗号化だけ」が誤り。選択肢3は「対策不要」が誤り。選択肢4は「文字を大きくする」が誤りだ。

選択肢判定理由
1プレースホルダが根本対策で正しい
2暗号化だけでは防げない
3対策は必要
4文字の大きさとは無関係

オリジナル問題3(多層防御と手口)

📝 オリジナル問題 3 多層防御と手口

SQLインジェクションの対策や手口に関する次の記述のうち、正しいものはどれか。

  1. エスケープだけで完全に防げるため、プレースホルダや多層防御はいっさい不要とされているのが実情である
  2. WAFを入れればそれ単独で完全に防げるため、ほかの対策はまったく要らないとされているものなのである
  3. 手口にはUNIONやError、Blindなどがあり、プレースホルダを軸にWAFなども重ねる多層防御が有効である
  4. SQLインジェクションには手口が1種類しかなく、対策の優先順位をそもそも考える必要はいっさいないとされているのだ
ピーエムロボ
ピーエムロボ 解答・解説

解答は 3 だ。

手口にはUNION・Error・Blindなどがあり、対策はプレースホルダを軸に、WAFなども重ねる多層防御が有効。1つの対策だけに頼らないのがポイントだ。

選択肢1は「エスケープだけで完全」が誤り。選択肢2は「WAF単独で完全」が誤り。選択肢4は「手口が1種類」が誤りだ。

選択肢判定理由
1エスケープだけでは不十分
2WAF単独では防ぎきれない
3手口は複数・プレースホルダ軸の多層防御で正しい
4手口は複数あり優先順位も大事

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る