検査ツール作成の一環として、SQL Injection脆弱性を利用してデータを抜き出すツールを作成しました。
使い方
この手のツールを使ったことがある人は、見れば何となく分かると思いますが、簡単に説明します。
まずは、検査対象のリクエストとパラメータを指定します。指定できるパラメータは、GET/POSTパラメータ、Cookie、HTTPヘッダ、URLパスです。
次に、DBから抜き出したいデータを指定します。デフォルトではDBMSのバージョンを抜き出します。それ以外のSQL文の実行結果も抜き出し可能ですが、現時点では、文字列型のスカラー値を返すSQL文のみが指定可能です。逆に言うと、複数行もしくは複数列を返すSQL文は指定できませんし、DBMSによっては数値型のスカラー値を返すSQL文も指定できません。*1
その次に、SQLエラーの判別方法を指定します。データを抜き出すためには、パラメータを操作してリクエストを送信した際の応答を見て、サーバアプリでSQLエラーが発生したか否かを判断する必要がありますが、ここで指定するのはその判別方法です。
デフォルトでは、応答のステータスコードや内容(エラーメッセージが含まれるか、あるいは正常値を送った際の応答との違い)から自動判別しますが、うまく判別できない場合にはツールに対して判別方法(正規表現)を教えてあげます。
最後に、リクエストごとに入れるウェイト時間を指定します。
ツールの特徴
2007年12月2日の日記にも書きましたが、世の中にはすでにいくつものSQL Injectionツールが存在します。
今回作ったツールは、これらの既製のツールと比べて何か革新的な新しさがあるわけではありません。既製のいくつかのツールを参考にして、必要なロジック改善や機能追加をしたのが、今回のツールです。*2
主要な機能/特徴を挙げると、以下のようになります。
作成の工数
今回は、既存の検査ツール用のクラスなどを利用したため、新しく書いたコードは1KLもないです。ですので、構想=1日、実装/テスト=2日程度の労力でほぼ完成しました。
ゼロから作るのであっても、比較的簡単なものならば、コード量としては2〜3KL程度を見ておけば充分だと思います。実際NGSSのツール(C言語で書かれている)は1KL程度のボリュームしかありません。
*2:特に、NGSS SQL Injectorが好きなので、fingerprint機能などは参考にさせてもらいました。