SQL Injection Toolの作成

検査ツール作成の一環として、SQL Injection脆弱性を利用してデータを抜き出すツールを作成しました。

使い方

f:id:teracc:20090806231217g:image

この手のツールを使ったことがある人は、見れば何となく分かると思いますが、簡単に説明します。

まずは、検査対象のリクエストとパラメータを指定します。指定できるパラメータは、GET/POSTパラメータ、Cookie、HTTPヘッダ、URLパスです。

次に、DBから抜き出したいデータを指定します。デフォルトではDBMSのバージョンを抜き出します。それ以外のSQL文の実行結果も抜き出し可能ですが、現時点では、文字列型のスカラー値を返すSQL文のみが指定可能です。逆に言うと、複数行もしくは複数列を返すSQL文は指定できませんし、DBMSによっては数値型のスカラー値を返すSQL文も指定できません。*1

その次に、SQLエラーの判別方法を指定します。データを抜き出すためには、パラメータを操作してリクエストを送信した際の応答を見て、サーバアプリでSQLエラーが発生したか否かを判断する必要がありますが、ここで指定するのはその判別方法です。

デフォルトでは、応答のステータスコードや内容(エラーメッセージが含まれるか、あるいは正常値を送った際の応答との違い)から自動判別しますが、うまく判別できない場合にはツールに対して判別方法(正規表現)を教えてあげます。

最後に、リクエストごとに入れるウェイト時間を指定します。

ツールの特徴

2007年12月2日の日記にも書きましたが、世の中にはすでにいくつものSQL Injectionツールが存在します。

今回作ったツールは、これらの既製のツールと比べて何か革新的な新しさがあるわけではありません。既製のいくつかのツールを参考にして、必要なロジック改善や機能追加をしたのが、今回のツールです。*2

主要な機能/特徴を挙げると、以下のようになります。

  • 5種類のDBMSに対応
  • DBMSのfingerprintとDBデータの抜き出し機能を持つ
    • ただし、各種のexploit機能(xp_cmdshellなど)はない
  • データの抜き出しは、エラーメッセージベースの手法とBlind手法に対応
    • UNION手法や、Time Delayを利用したBlind手法には対応していない
  • 通常のツールではデータを抜けないようなページに対応している
    • ex. ワンタイムトークンが必要なページの脆弱性
    • ex. 一旦値がセッション変数などに入って、別のリクエストで発動するタイプの脆弱性
  • SELECTのWHEREへの挿入以外にも対応可能
    • ex. INSERT VALUESや、UPDATE SETの数値/文字列リテラルへの挿入
    • ex. カラム名(SELECTのORDER BY)などへの挿入

作成の工数

今回は、既存の検査ツール用のクラスなどを利用したため、新しく書いたコードは1KLもないです。ですので、構想=1日、実装/テスト=2日程度の労力でほぼ完成しました。

ゼロから作るのであっても、比較的簡単なものならば、コード量としては2〜3KL程度を見ておけば充分だと思います。実際NGSSのツール(C言語で書かれている)は1KL程度のボリュームしかありません。

*1:DB2などは型に厳しいため。

*2:特に、NGSS SQL Injectorが好きなので、fingerprint機能などは参考にさせてもらいました。