SQLインジェクション(1)

SQLインジェクションの攻撃の一般的な流れ
SQLインジェクション攻撃の基本的な流れは、次の通りです。
1. 攻撃者が、脆弱性を含むWebアプリケーション・システムを「選定」する
2. Webアプリケーション上の入力フォームに「不正なSQL文」を入力し、送信する
3. 「データベース」へ不正なSQL文が送られ、実行される
4. データベースからWebサイトへ、SQLの実行結果が返却される
(例:会員すべての登録データを開示してください)
5. 実行結果を悪用し、攻撃者はデータベースに登録された会員情報を窃取をしたり、情報の改ざん・削除などを行うことができる
SQLインジェクションの仕組み
少し難しい内容ですが、SQL文を用いて、SQLインジェクションの仕組みについてお話しします。
以下のSQL文は「データベースから、ユーザーの情報を検索する」という意味になります。Webサイト上で、ユーザーの情報を絞り込んだり、表示させたりする際に使用します。
SELECT * FROM users WHERE name = ‘エムオー太郎’;
より具体的には「usersというテーブルから、nameという列の値が、入力値と一致するレコードを全て取得する」という意味です。例えば、入力値が「エムオー太郎」だった場合、usersテーブルからnameが「エムオー太郎」であるレコードが、全て抽出されます。
これに対し、SQLインジェクション攻撃によって、入力値に「MOTEX’ OR ‘MOTEX’ = ‘MOTEX」 という文字列を与えると、どうなるでしょう。SQL文は次のように変わります。
SELECT * FROM users WHERE name = ‘MOTEX’ OR ‘MOTEX’ = ‘MOTEX’;
このSQL文では、条件が常に「真」となるため、データベースへ送られ命令が実行されると、データベースから全てのユーザー情報が抽出され閲覧できてしまいます。
このようにSQLインジェクションを悪用すると、本来見ることのできない情報をデータベースから盗み出したり、あるいは別のSQL文を注入して、データの改ざん・削除などを行うことができてしまいます。
SQLインジェクションの具体的な対策方法
SQLインジェクションの具体的な対策方法として、以下の様な手段があげられます。
1. プレースホルダーを利用する
2. エスケープ処理(サニタイジング)を行う
3. 詳細なエラーを表示しない
4. Webアプリケーションを最新の状態に
5. Webサイトの脆弱性診断を行う
1つずつ嚙み砕いてご説明します。
1.プレースホルダの利用
1つ目に行いたいSQLインジェクション攻撃対策は「プレースホルダーを利用すること」です。
プレースホルダーとは、SQL文の中で「値が変動する部分」に用いる、文字列や記号です。「SQL文」とは先述の通り、データベースを操作するために、指示出しに使う言語を指します。
SQLインジェクションは、ユーザーからの入力内容に不正なSQL文を含めることで、データベースに、本来意図しない操作をさせる攻撃でした。
しかしプレースホルダーを使うことで、入力された値はあくまで「文字列」として扱われ、仮に不正な値が入力されても、SQL命令に関わる「特殊文字」は無効化(エスケープ処理)されます。結果的に、SQL文として不正な操作が実行されるのを防ぐことが可能です。
▼SQLの実行時に「プレースホルダー」を用いる例
元のSQL文($name の部分が変動)
$sql = “SELECT * FROM user WHERE name=‘$name’;
↓ SQL文の中で値が変動する部分に、コロン(:)やクエスチョンマーク(?)などの記号を設置(=プレースホルダー)
「:name」がプレースホルダー
$sql = “SELECT * FROM user WHERE name=:name“;
このように、プレースホルダーはSQL文の中で値が変動する部分に直接反映するのではなく、代替しているため、攻撃者の仕込んだ不正なデータベース操作を防止することができます。
後述のエスケープ処理と併用すると、さらに安全性を高められます。
2.エスケープ処理(サニタイジング)を行う
エスケープ処理とは、データベースが持つ特殊記号を無効化する処理のことです。「エスケープ処理」を行うことで、攻撃者がWebアプリケーション上で不正なSQL文を注入しても、命令の実行を防ぐことが可能となります。
エスケープ処理の例としては、「’」や「”」や「\」などの特殊記号を「”」「””」「\\」などとしてその記号の意味を無効化する処理を行います。ただし、特殊記号の取り扱いはデータベースによって異なるため、データベースに応じた対策が必要となります。
3.詳細なエラーを表示しない
3つ目の対策は「詳細なエラーを表示しない」ことです。
詳細なエラーとは、データベースに対するSQL文が不正なものであった場合、表示されるエラー情報のことです。
通常、データベースに対して対話型のコマンドでSQL文を送ると、SQL文が不正な場合は「エラー」が表示されます、しかし、詳細なエラー情報を表示することは、結果的に「攻撃者に不必要な情報を与えてしまうこと」になりかねません。
攻撃者が、意図した情報を取得できてしまう可能性もあるため、詳細なエラーを表示しないよう設定しておくことが必要です。