Deep SecurityでSQLインジェクションをブロックしてみた
はじめに
Trend Micro Deep Securityの侵入防御機能を使って、SQLインジェクションをブロックしてみました。
検証には以前作成した脆弱性をもつサイトを使いました。
ユーザーIDとパスワードを入力すると、そのユーザーのメールアドレスを表示するWebサイトです。
Webサイトの動作を紹介します。
正しい動きの例
ユーザIDとパスワードを指定の上、送信ボタンを選択すると、指定したユーザのメールアドレスが表示されます。
SQLインジェクションの例
パスワード欄に'OR 'A' = 'A
を指定すると、全てのユーザのメールアドレスが表示されます。
ユーザ情報が漏れてしまった状況を再現しています。
この動作をDeep Securityでブロックしてみました。
侵入防御ルールを追加
EC2にDeep Security Agentをインストールします。
手順はこちらをご覧ください。
SQLインジェクションへの対応は、侵入防御機能を使います。
コンピュータエディタまたは、ポリシーエディタを開きます。
侵入防御 > 一般 を選択し、有効化します。
動作は"防御"としました。"検出"ではイベントが生成されますが、ブロックはされません。
「割り当て/割り当て解除...」を選択します。
"Webアプリケーションの保護"でフィルタリングし、以下のルールを選択します。
"HTTP Protocol Decoding"は依存関係のため必要です。
- 1000128 - HTTP Protocol Decoding
- 1000608 - Generic SQL Injection Prevention
- 1005613 - Generic SQL injection Prevention - 2
ルールの中には、誤判定を引き起こすものもあります。初期設定では、これらのルールは検出のみに設定されています。
"Generic SQL Injection Prevention - 2"のデフォルト値は検出のみです。
ルールを選択し、モードを変更します。
動作確認
パスワードに' OR 'A' = 'A
を入力すると、通信がブロックされました。
侵入防御イベントから、イベントの取得を行います。
侵入防御イベントに、時刻、コンピュータ、理由、送信元IPなどが記録されました。
イベントを選択すると、詳細を確認出来ます。
SQLインジェクションルールは推奨設定の検索外
Deep Securityは、推奨検索を利用することで、保護するコンピュータを検索しセキュリティルールの適用や適用解除を推奨してくれます。
SQLインジェクションルールは推奨設定の検索によって、推奨されません。
前述のように個別にルール追加します。
検知の仕組みと設定
「1000608 - Generic SQL Injection Prevention」の仕組みが紹介されていました。
動作の概要
パケットデータの先頭から順に設定されたキーワードに合致するものを検索し、合致したキーワードに割り当てられたスコアを合計して、スコアの合計が設定された閾値を超えると接続を拒否またはログを記録します。
例としてinsert intoload_file'
のスコアは、"insert into"、"load_file"がそれぞれ2、シングルクォートは1で合計5です。
「1000608 - Generic SQL Injection Prevention」のデフォルト値は以下の通りです。
5以上の時に、接続の拒否とログ記録が行われます。
- Drop Threshold(接続拒否) = 4
- Log Threshold(ログ記録) = 4
検証サイトでパスワードにinsert intoload_file'
を指定したところ、スコアが5>4(閾値)となりブロックされました。
終わりに
Trend Micro Deep Securityの侵入防御機能を使って、SQLインジェクションをブロックしてみました。
本番環境では有効化する場合は誤検知を軽減するため、検出モードで確認後、防御に変更下さい。
検証環境
- Trend Micro Deep Security as a Service