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

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


この記事のまとめ
- SQLインジェクションの概要
- SQLインジェクションの流れ
- SQLインジェクションの対策
SQLインジェクション

SQLインジェクションは、ユーザの入力データを基にSQL文を編集し、データベースへ反映させるWebサイトにおいて不正なSQL文を入力する攻撃です。
SQLインジェクション対策が実施されていないサイトでは、データベースの不正な操作により中身が書き換えられたり、重要な情報が取得されたりする危険があります。
SQLインジェクションの実行方法

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


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

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

また、SQLインジェクションの脆弱性はWebサイト側だけの問題ではありません。下記にも注意が必要です。
- データベースへのアクセス権が必要以上に与えられている
- SQLのエラーメッセージが詳細にクライアントに返る設定になっている
SQLインジェクションの対策
SQLインジェクションの対策方法としては、下記のようなものがあります。
バインド機構
バインド機構は、変数部分にプレースホルダと呼ばれる特殊文字を使用してSQLのひな形をあらかじめ用意し、後から特殊文字に値を代入しSQL文を完成させる方法です。
割り当てられる変数は、数値もしくは文字列の定数として扱われるため、変数の中にSQL文として意味を持つ文字が含まれていても自動的にエスケープ処理され、単なる文字列として扱われます。
エスケープ処理
Webサイト上で入力データのうち、「’」「;」「%」「+」など、SQL文において意味を持つメタキャラクタをエスケープ処理する方法も、SQLインジェクションの対策につながります。
Webアプリケーション以外での対策
上記の対策はWebアプリケーションで実施できるものです。それ以外の対策方法も確認しておきましょう。
- クライアントへの詳細なエラーメッセージを送らないようにする
- WAF(Web Application Firewall)でSQLインジェクションを遮断する
- データベースのアクセス権限を最小限に絞る
SQLインジェクション・例題
実際に例題を解いて問題に慣れていきましょう。
問1
アカウント
| 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 ‘;–
(ログイン後回答すると、ここに前回の正誤情報が表示されます)
問2
| WEBアプリケーションプログラムの実装における対策 | WEBアプリケーションプログラムの実装以外の対策 | |
| ア | Webアプリケーションプログラム内でシェルを起動しない。 | chroot環境でWebサーバを稼働させる。 |
| イ | セッションIDを乱数で生成する。 | TLSによって通信内容を秘匿する。 |
| ウ | パス名やファイル名をパラメータとして受け取らないようにする。 | 重要なファイルを公開領域に置かない。 |
| エ | プレースホルダを利用する。 | Webアプリケーションプログラムが利用するデータベースのアカウントがもつデータベースアクセス権限を必要最小限にする。 |
ア
イ
ウ
エ
(ログイン後回答すると、ここに前回の正誤情報が表示されます)
SQLインジェクション・まとめ
この記事のまとめ
- SQLインジェクションの概要
- SQLインジェクションの流れ
- SQLインジェクションの対策
SQLインジェクションは過去にも何度か問われた攻撃手法です。攻撃を受けるとどうなるのかとあわせて、対策も確認しておきましょう。
次回はOSコマンドインジェクションについて学習します。










ディスカッション
コメント一覧
まだ、コメントがありません