SQLインジェクションの検査手法
SQLインジェクションは、特別なHTTPリクエストを送信すると、HTTPレスポンスに、「SQLインジェクションが可能です」といった文字列が、常にXSSのように含まれるわけではない。このため、XSSの検査に比べて、脆弱性の有無が分かりにくいことが多い。
しかし、以下のような方法で、SQLインジェクションの脆弱性の有無をある程度(単純なケースならば)判断することが可能だ。
1. エラーメッセージの内容を元に確認
2. 特別な値を入力データとする複数のHTTPリクエストに対するHTTPレスポンスの違いを元に確認
それでは、それぞれの方法で、どのように検査を実施するか見ていこう。
1. エラーメッセージの内容を元に確認
この方法は、組み立てられたSQL文が文法エラーとなるように入力データを細工したリクエストを送信し、そのHTTPレスポンスにシステムが出力する文法エラーが含まれているかどうかで判断する。この方法で検査する場合に使用する検査データには、たとえば以下のようなものがある。
- 「;」を用いてSQL文を強制的に終了させるケース
- 「'」を用いて文字列定数を強制的に終了させるケース
これらの値をパラメータ値として使用した場合、先の例のSQL文では以下のようなSQL文が作成される。
これらは、SQL文として不適切であるため、データベースがエラーをアプリケーションに返す。サーバの設定に依存するが、アプリケーションは、データベースから受け取ったエラーをそのままHTTPレスポンスとして返すことがあり、検査ではデータベースのエラーがHTTPレスポンスに含まれていないかを確認する。