SQLインジェクション【情報処理安全確保支援士講座】

情報処理安全確保支援士 SQLインジェクション

今回は、情報処理安全確保支援士の試験で問われるSQLインジェクションについて解説します。

アカリ
アカリ
これまた難しそうな名前・・・
トモル
トモル
SQLインジェクションは、データベースを操作する言語(SQL)を不正に注入(インジェクション)して不正に操作する攻撃だよ

この記事のまとめ

  1. SQLインジェクションの概要
  2. SQLインジェクションの流れ
  3. SQLインジェクションの対策

SQLインジェクション

情報処理安全確保支援士 SQLインジェクション

SQLインジェクションは、ユーザの入力データを基にSQL文を編集し、データベースへ反映させるWebサイトにおいて不正なSQL文を入力する攻撃です。

SQLインジェクション対策が実施されていないサイトでは、データベースの不正な操作により中身が書き換えられたり、重要な情報が取得されたりする危険があります。

SQLインジェクションの実行方法

情報処理安全確保支援士 SQLインジェクションの流れ

ユーザ名のパスワードを入力する欄において、入力内容からSQLを発行するWebサイトでの動作例を確認しましょう。

正常な入力データの場合

情報処理安全確保支援士 SQLインジェクション 正常なデータ

アカリ
アカリ
入力データを、もともと用意してあるSQLのひな形に埋め込む感じなんだね!
📝【出題履歴】平成24年度春期 午後Ⅰ問2 SQLインジェクションに関する出題

【問題文】

S氏が表1のHTTPアクセスログを調査した結果,次の攻撃が判明した。

IPアドレスが a の攻撃者が, b .cgiに対しSQLインジェクションによって全会員分に当たる約8,000件の会員ID及びパスワードを窃取していた。

情報セキュリティスペシャリスト試験 平成24年度春期 午後Ⅰ問1 表1

【設問】

設問1
(1) 本文中の a に入れるIPアドレスを一つ答えよ。
(2) 本文中の b に入れるcgiプログラム名を7文字以内で答えよ。

出題:平成24年度春期 午後Ⅰ問2

不正な入力データによるSQLインジェクションの場合

情報処理安全確保支援士 SQLインジェクション 不正なデータ

今回の攻撃事例では、「name = ‘USER’ AND PW = “」と、常に真である「’1′ = ‘1’」のorを取るため、結果的にusersのすべてのレコードが選択されます。

キュー
キュー
「’」や「%」のSQLとして意味を持つ特殊文字をそのまま受け入れてしまうWebサイトやと、すぐにSQLインジェクションが成功してしまうで

また、SQLインジェクションの脆弱性はWebサイト側だけの問題ではありません。下記にも注意が必要です。

SQLインジェクションの脆弱性
  • データベースへのアクセス権が必要以上に与えられている
  • SQLのエラーメッセージが詳細にクライアントに返る設定になっている

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

SQLインジェクションの対策方法としては、下記のようなものがあります。

バインド機構

バインド機構は、変数部分にプレースホルダと呼ばれる特殊文字を使用してSQLのひな形をあらかじめ用意し、後から特殊文字に値を代入しSQL文を完成させる方法です。

割り当てられる変数は、数値もしくは文字列の定数として扱われるため、変数の中にSQL文として意味を持つ文字が含まれていても自動的にエスケープ処理され、単なる文字列として扱われます。

Attention!!
プレースホルダがLIKE句に含まれる場合、「%」や「_」はワイルドカードを意味する文字列となります。単なる文字列として扱いたい場合はそれぞれの文字を事前にエスケープ処理する必要があります。
📝【出題履歴】令和5年度春期 午後Ⅰ問1 バインド機構に関する出題

【問題文】

情報処理安全確保支援士試験 令和5年度春期 午後Ⅰ問1 図1

情報処理安全確保支援士試験 令和5年度春期 午後Ⅰ問1 表1

この解析結果を受けて,Fさんは,Eさんの指導の下,ソースコードを修正した。
表1の項番1について,図1の8行目から11行目を図2に示すソースコードに修正した。項番2と項番3についてもソースコードを修正した。

情報処理安全確保支援士試験 令和5年度春期 午後Ⅰ問1 図2

【設問】

設問1
(3) 図2中の c , d に入れる適切な字句を答えよ。

出題:令和5年度春期 午後Ⅰ問1

エスケープ処理

Webサイト上で入力データのうち、「’」「;」「%」「+」など、SQL文において意味を持つメタキャラクタをエスケープ処理する方法も、SQLインジェクションの対策につながります。

Webアプリケーション以外での対策

上記の対策はWebアプリケーションで実施できるものです。それ以外の対策方法も確認しておきましょう。

Webアプリケーション以外での対策
  • クライアントへの詳細なエラーメッセージを送らないようにする
  • WAF(Web Application Firewall)でSQLインジェクションを遮断する
  • データベースのアクセス権限を最小限に絞る
スポンサーリンク

SQLインジェクション・例題

実際に例題を解いて問題に慣れていきましょう。

問1

“アカウント”表に対して,SQL文を実行したとき,”アカウント”表の全ての行が取得される入力パラメータはどれか。ここで,入力パラメータのエスケープ処理は行わない。また,”;”はSQL文の終端として解釈されるものとする。(H.28春/問7)

アカウント

ID ユーザ名 メールアドレス
A001 TARO JOHO t-joho@email.org.jp
A002 JIRO JOHO j-joho@email.org.jp
A003 HANAKO JOHO h-joho@email.org.jp

〔SQL文〕
SELECT ID,ユーザー名,メールアドレス FROM アカウント
  WHERE ユーザー名 = ‘入力パラメータ’

ア:’ OR ‘–‘ = ‘–
イ:’ OR ユーザー名 = ‘ユーザー名
ウ:’– OR 1 = 1
エ:\’ OR 1 = 1 ‘;–

(ログイン後回答すると、ここに前回の正誤情報が表示されます)

問1の正解を表示

問1の解説を表示

それぞれの入力パラメータを代入したときに、WHERE句でどのような選択条件が発生するか確認しましょう。
ア:’ OR ‘–‘ = ‘–

WHERE ユーザー名='' OR '--' = '--';
OR演算の右辺「’–‘ = ‘–‘」の式は常に真を返すので、全ての行でWHERE句の結果が真になります。結果的に”ユーザー名”列の値に関わらず全ての行が選択されます。

※SQLで「–」は、コメントを記述するための記法です。しかしこのSQL文では「–」はシングルクォートで囲まれているので、コメントではなく文字列として扱われます。

イ:’ OR ユーザー名 = ‘ユーザー名

WHERE ユーザー名='' OR ユーザー名 = 'ユーザー名';
“ユーザー名”列の値が、空文字又は”ユーザー名”である行が選択対象です。アカウント表で該当する行は存在しません。

ウ:’– OR 1 = 1

WHERE ユーザー名=''-- OR 1 = 1';
このSQL文の「–」以降がコメントと考えると、実質的には下記と同じ意味になります。
WHERE ユーザー名='';
この条件では”ユーザー名”列の値が、空文字の行が選択対象になりますが、アカウント表に該当する行は存在しません。

エ:\’ OR 1 = 1 ‘;–

WHERE ユーザー名='\' OR 1 = 1 ';--';
SQLでは、改行・タブなどの空白文字や、SQLの構文で使用される特殊文字(‘”%_\)を一般文字として扱うエスケープ処理が可能です。このSQL文の「\’」の部分がエスケープ処理に該当し、文字列の囲み文字ではなく文字としてのシングルクォート(‘)を表しています。

また”;”は1つのSQL文の終端を表し、”;”より後は次のSQL文として解釈されます。しかしこのSQL文の”;”以降は「–」でコメントアウトされた行のみのため無視できます。結果的にSQL文は以下と同じになります。
WHERE ユーザー名='\' OR 1 = 1 ';

したがって、「ア」が正解です。

問2

SQLインジェクション対策について,Webアプリケーションプログラムの実装における対策と,Webアプリケーションプログラムの実装以外の対策の組みとして,適切なものはどれか。(R.5春/問17)
WEBアプリケーションプログラムの実装における対策 WEBアプリケーションプログラムの実装以外の対策
Webアプリケーションプログラム内でシェルを起動しない。 chroot環境でWebサーバを稼働させる。
セッションIDを乱数で生成する。 TLSによって通信内容を秘匿する。
パス名やファイル名をパラメータとして受け取らないようにする。 重要なファイルを公開領域に置かない。
プレースホルダを利用する。 Webアプリケーションプログラムが利用するデータベースのアカウントがもつデータベースアクセス権限を必要最小限にする。




(ログイン後回答すると、ここに前回の正誤情報が表示されます)

問2の正解を表示

問2の解説を表示

プレースホルダとは、SQL文の中でユーザーからの入力値を代入する部分に置かれる記号です。プレースホルダには、実行時にSQL文の特殊文字がエスケープされた値が割り当てられるため、不正なSQL文の実行を防げます。SQL文のひな型を用意し、実行時に値を割り当ててSQLインジェクションを防止する仕組みをバインド機構と呼びます。

ア:Webアプリケーションプログラム内でシェルを起動しない。/chroot環境でWebサーバを稼働させる。
→OSコマンドインジェクションの対策です。したがって誤りです。

イ:セッションIDを乱数で生成する。/TLSによって通信内容を秘匿する。
→セッションハイジャックの対策です。したがって誤りです。

ウ:パス名やファイル名をパラメータとして受け取らないようにする。/重要なファイルを公開領域に置かない。
ディレクトリトラバーサルの対策です。したがって誤りです。

エ:プレースホルダを利用する。/Webアプリケーションプログラムが利用するデータベースのアカウントがもつデータベースアクセス権限を必要最小限にする。
→SQLインジェクションの対策です。

これより、「エ」が正解です。

SQLインジェクション・まとめ

この記事のまとめ

  1. SQLインジェクションの概要
  2. SQLインジェクションの流れ
  3. SQLインジェクションの対策

SQLインジェクションは過去にも何度か問われた攻撃手法です。攻撃を受けるとどうなるのかとあわせて、対策も確認しておきましょう。

次回はOSコマンドインジェクションについて学習します。


本気で支援士を狙うなら・・・
支援士ゼミがおすすめです!
  • ベテラン講師による手厚いサポート
  • モチベーションを保てるセキュリティコラムが満載!
  • マンツーマン形式で個別相談もできる!

スポンサーリンク