SQLインジェクション防御ルールの設定

侵入防御 モジュールには、SQLインジェクション攻撃を検出して接続を破棄したり、特性に応じてログに記録するビルトインルールが含まれています。このルールは、 1000608 - 一般的なSQLインジェクション対策 と呼ばれ、組織のニーズに合わせて設定できます。たとえば、ルールの感度を変更するには、破棄のしきい値を変更します。

SQLインジェクション攻撃とは

SQLインジェクション攻撃 (またはSQLフィッシング攻撃) はデータ駆動型アプリケーションの攻撃方法で、攻撃者の入力フィールドにはSQL文が分割して含まれます。新規に生成された不正なSQLコマンドがWebサイトからデータベースに渡され、実行されます。このコマンドによって、攻撃者はデータベース内の情報の読み取り、追加、削除、または変更ができます。

SQLインジェクション攻撃に共通する文字および文字列

以下は一般的に使用される文字および文字列の例です。このリストは一部です。

  • ('
  • %27
  • \x22
  • %22
  • char
  • ;
  • ascii
  • %3B
  • %2B
  • --
  • %2D%2D
  • /*
  • %2F%2A
  • */
  • %2A%2F
  • substring
  • drop table
  • drop+table
  • insert into
  • insert+into
  • version(
  • values
  • group by
  • group+by
  • create table
  • create+table
  • delete
  • update
  • bulk insert
  • bulk+insert
  • load_file
  • shutdown
  • union
  • having
  • select
  • declare
  • exec
  • and
  • or
  • like
  • @@hostname
  • @@tmpdir
  • is null
  • is+null
  • is not null
  • is+not+null
  • %3D
  • CONCAT
  • %40%40basedir
  • version%28,user(
  • user%28,system_user(
  • (,%28,)
  • %29
  • @
  • %40
  • cast

Generic SQL Injection Preventionのルールはどのように機能しますか?

SQLインジェクション攻撃を検出するために、Generic SQL Injection Preventionルールではスコアリングシステムが使用されます。ルールは次のように動作します。

  1. アプリケーションからのパケットは、分析のためにDeep Security Agentに到着します。
  2. [Generic SQL Injection Prevention]ルールはパケットを確認し、次の表に示すいずれかの文字列が存在するかどうかを判断します。文字列はカンマで区切られ、10個のグループに分類されています。
  3. 文字列が見つかった場合、スコアが次のように計算されます。
    • 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
    • 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが合計されます。
    • 同じ グループ内に複数の文字列がある場合、そのグループのスコアは1回のみカウントされます。
      明確化のために、 ルール のルールとスコアリングシステムの例を参照してください。
  4. Workload Security は、合計スコアを使用して、接続を削除するか、ログに記録するかを決定します。合計スコアが破棄のしきい値スコアを超えた場合、接続は中断されます。ログしきい値スコアを超えた場合は、ログに記録されます。

トレンドマイクロではルールが頻繁に更新されるため、次の表の文字列が Workload Securityの文字列と正確に一致しないことがあります。

次の行に「\W」を使用すると、「英数字以外の文字が続く」ことを意味します。

グループ スコア
drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk insert,bulk+insert,shutdown\W,from\W 2
declare\W,select\W 2
cast\W,exec\W,load_file 2
union\W,group by,group+by,order by,order+by,having\W 2
and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W 1
--,%2D%2D ,/\*,%2F%2A ,\*/,%2A%2F 1
',%27,\x22,%22,char\W 1
;,%3B 1
%2B,CONCAT\W 1
%3D 1
(,%28,),%29,@,%40 1
ascii,substring 1

バージョン(,バージョン%28、ユーザ(,ユーザ%28、system_user(,system_user%28、データベース(,データベース%28 ,@@ホスト名、%40%40hostname ,@@ベース、%40%40basedir ,@@tmpdir、%40%40tmpdir、
@@datadir、%40%40datadir
2

ルールおよび評価システムの実例

次に、スコアの集計方法とシナリオごとの処理方法の例を示します。

例1:トラフィックのログ記録と破棄が発生

次のルール設定 (グループのスコアはコロン (「:」) の後にあります) を使用すると仮定します。

drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk insert,bulk+insert,shutdown\W,from\W:2
declare\W,select\W:2
cast\W,exec\W,load_file:2
union\W,group by,group+by,order by,order+by,having\W:2
and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W:1
--,%2D%2D,/\*,%2F%2A,\*/,%2A%2F:1
',%27,\x22,%22,char\W:1
;,%3B:1
%2B,CONCAT\W:1
%3D:1
(,%28,),%29,@,%40:1
ascii,substring:1
version(,version%28,user(,user%28,system_user(,system_user%28,databas
(,database%28,@@hostname,%40%40hostname,@@basedir,%40%40basedir,@@tmpdir,%40%40tmpdir,@@datadir,
%40%40datadir:2

Log Threshold: 3
Drop Threshold: 4

ここで、次の攻撃文字列が発生したとします。

productID=BB10735166+UNION/**/+SELECT+FROM+user

次の集計をして、合計スコアは5 (2+1+0+2) になります。

  • 文字列 UNION/ は、スコア4の4番目のグループに一致します。
  • 文字列 /* は、6番目のグループと一致し、スコア1になります。
  • 文字列 */ は、6番目のグループのスコアが0に一致します(6番目のグループのスコアはすでにカウントされているため)。
  • 文字列 SELECT+ は、スコア2の2番目のグループに一致します。

合計スコアは5で、ログが生成され、トラフィックは破棄されます。

例2: トラフィックのログ/破棄が発生しない

このルール設定を使用しているとします(ここで、 select\W 文字列は union\W ):と同じ行に移動されています)。

drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk insert,bulk+insert,shutdown\W,from\W:2
declare\W:2
cast\W,exec\W,load_file:2
union\W,select\W,group by,group+by,order by,order+by,having\W:2
and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W:1
--,%2D%2D,/\*,%2F%2A,\*/,%2A%2F:1
',%27,\x22,%22,char\W:1
;,%3B:1
%2B,CONCAT\W:1
%3D:1
(,%28,),%29,@,%40:1
ascii,substring:1
version(,version%28,user(,user%28,system_user(,system_user%28,databas
(,database%28,@@hostname,%40%40hostname,@@basedir,%40%40basedir,@@tmpdir,
%40%40tmpdir,@@datadir,%40%40datadir:2

Log Threshold: 3
Drop Threshold: 4

ここで、次の攻撃文字列が発生したとします。

productID=BB10735166+UNION/**/+SELECT+FROM+user

次の集計をして、合計スコアは3 (2+1+0+0) になります。

  • 文字列 UNION/ は、スコア4の4番目のグループに一致します。
  • 文字列/*は6番目のグループと一致し、スコア1になります。
  • 文字列 */ は、6番目のグループのスコアが0に一致します(6番目のグループのスコアはすでにカウントされているため)。
  • 文字列 SELECT+ は、4番目のグループとスコア0(4番目のグループのスコアはすでにカウントされているため)と一致します。

合計スコアは3で、ログは生成されず、トラフィックは破棄されません。ログや破棄が発生するには、スコアがしきい値を超える必要があります。

Generic SQL Injection Preventionルールを設定する

Generic SQL Injection Preventionルールは組織のニーズに合わせて設定できます。設定可能なオプションを次の図に示します。

ルールを設定するには、次の手順に従います。

  1. Workload Security コンソールにログインします。
  2. 画面上部の [ポリシー] をクリックします。
  3. 右側の検索ボックスに、Generic SQL Injection Preventionルールの数値IDである1000608を入力します。Enterキーを押します。メイン画面にルールが表示されます。
  4. ルールをダブルクリックします。
  5. Configuration タブをクリックします。SQLインジェクションパターンは、上部のテキストボックスに表示されます。
  6. カスタマイズをまだしていない場合は、このSQLインジェクションパターンを最新のバージョンにアップデートします。最新のパターンにアップデートするには、[ 詳細 ]タブに移動し、[ Default SQL Pattern ]見出しの下のテキストをコピーし、[ Configuration ]タブの[ SQLインジェクションパターンファイル ]テキストボックスに貼り付けます。現在、トレンドマイクロから最新のパターンファイルを使用して作業しています。
  7. 次のようにフィールドを編集します。

    • SQL Injection Patterns: SQLインジェクション攻撃に使用する文字と文字列のリストを指定します。文字と文字列はグループ化されており、スコアが割り当てられています。文字列を追加または変更する場合は、適切なエンコードを使用してください。詳細については、以下の「文字エンコードのガイドライン」を参照してください。
    • Drop Threshold: 破棄スコアを指定します。このしきい値をスコアが超えると、接続は中断されます。(スコアがDrop Thresholdと一致した場合、接続は維持されます)。初期設定は 4です。
    • Log Threshold: ログスコアを指定します。このしきい値をスコアが超えると、接続のログが記録されます(スコアがLog Thresholdと一致した場合、ログは記録されません)。初期設定は 4です。
    • Max distance between matches: スコアを0にリセットする場合の一致の最大間隔をバイト数で指定します。初期設定は 35です。

    通常のしきい値では超過してしまう可能性があるページやフィールドのオーバーライドを作成する場合は、次の2つのオプションの使用を検討します。

    • Pages (resource) with a non-default score to drop on: 特定のリソースについては [Drop Threshold] をオーバーライドできます。たとえば、 ドロップしきい値4で、アンケートページのドロップスコア 8 を希望する場合は、 /example/questionnaire.html:8を指定します。この設定では、 /example/questionnaire.html のスコアは より大きい必要があります8 接続をドロップするために必要がありますが、他のすべてのリソースは 4よりも高いスコアを必要とします。リソースは1行に1つ指定します。
    • Form parameters with a non-default score to drop on: [Drop Threshold] または [Pages (resources)with a non-default score to drop on] フィールドで定義したしきい値を特定のフォームフィールドについてはオーバーライドできます。たとえば、 ドロップしきい値 のスコアが 4の場合、ユーザ名フィールドの 10 のドロップスコアを高くする場合は、 /example/login.html:username=10を指定します。ここで、 /example/login.html は、ユーザ名フィールドが表示されるページのパスと名前、および username に置き換えられます。アプリケーションで使用されるユーザ名フィールドに置き換えられます。この設定では、ユーザ名フィールドの値は 10 より大きい値)に設定する必要がありますが、ページ自体は 4よりも高いスコアしか必要としません。フォームフィールドは1行に1つ指定します。

    ログのしきい値接続が一致したため接続が切断された場合には有効になりません。デフォルト以外のスコアをドロップするページ(リソース)または既定以外のスコアをドロップするフォームパラメータフィールド。たとえば、フォームパラメータフィールドを /example/login.html:username=10に設定し、ユーザ名フィールドのスコアが 11の場合、接続は切断されますが、このイベントのログはありません。

  8. [OK] をクリックします。

Generic SQL Injection Preventionルールが設定されました。

文字エンコードのガイドライン

Generic SQL Injection Preventionルールに文字列を変更または追加する場合は、適切にエンコードする必要があります。たとえば、パターンに引用符 ' を使用する場合は、 \x22と入力する必要があります。

以下の表に、文字とそのエンコード後の値、および拡張パターンを表現する場合に使用する文字クラスを示します。

入力する文字列 エンコードする文字

\a

\A

英字 (a~z A~Z)

英字以外の文字

例: delete\a とは、「削除」という単語の後にアルファベット文字「」が続くことを意味します。

\w

\W

英数字 (a~z A~Z 0~9)

英数字以外の文字

例: delete\W とは、「削除」の後ろに英数字以外の文字が続くことを意味します。

\d

\D

数字 (0~9)

数字以外の文字

例: delete\d とは、「delete」の後ろに「0〜9」の数字が続いていることを意味します。 "

\s

\S

空白文字

空白でない [\r,\n,\t、0x32]

例: delete\S は、「単語 'delete'に続いて空白以外」を意味します。

\p

\P

句読文字、上記以外の印字可能なASCII文字

句読文字以外の文字

例: delete\p とは、「削除」の後ろに句読点文字や印刷可能なasciiが続く単語を意味します。

\c

\C

制御文字 (ASCIIの32番より前または127番以降、空白文字は含まない)

制御文字以外の文字

制御文字の詳細については、ここを参照してください。

\.

任意

\xDD

16進数のバイト0xDD

\x2c

カンマ文字 (,)

\x22

2重引用符 (")

\\

エスケープされたバックスラッシュ (\)

\|

エスケープされたパイプ (|)

|xx xx xx...|

16進数パイプ (バイトシーケンス)