ビュー:
Deep Securityの侵入防御モジュールには、SQLインジェクション攻撃を検出し、その特性に応じて接続を切断するかログに記録する組み込みルールが含まれています。このルールは[1000608 - Generic SQL Injection Prevention]と呼ばれ、組織のニーズに合わせて設定できます。例えば、ドロップ閾値を変更することでルールの感度を調整できます。
ips-sql-injection-rule=c2373b32-56f0-4b9e-88dc-1fe20de3ee00.png
この記事のトピック:

SQLインジェクション攻撃とは何ですか?

SQLインジェクション攻撃、またはSQLフィッシング攻撃は、攻撃者がSQL文の一部を入力フィールドに含めることでデータ駆動型アプリケーションを攻撃する方法です。新たに形成された不正なSQLコマンドは、ウェブサイトによってデータベースに渡され、実行されます。このコマンドにより、攻撃者はデータベース内の情報を読み取ったり、追加、削除、変更したりすることが可能になります。

SQLインジェクション攻撃で使用される一般的な文字と文字列は何ですか?

ここに一般的に使用される文字と文字列を示します。このリストは完全ではありません。
  • ('
  • %27
  • \x22
  • %22
  • char
  • ;
  • ascii
  • %3B
  • %2B
  • --
  • %2D%2D
  • /*
  • %2F%2A
  • */
  • %2A%2F
  • substring
  • drop table
  • drop+table
  • insert into
  • insert+into
  • version(
  • group by
  • group+by
  • create table
  • create+table
  • delete
  • update
  • bulk insert
  • bulk+insert
  • load_file
  • shutdown
  • union
  • having
  • select
  • declare
  • exec
  • および
  • or
  • like
  • @@hostname
  • @@tmpdir
  • null
  • is+null
  • is not null
  • is+not+null
  • %3D
  • CONCAT
  • %40%40basedir
  • version%28,user(
  • user%28,system_user(
  • (,%28,)
  • %29
  • @
  • %40
  • cast

一般的なSQLインジェクション防止ルールはどのように機能しますか?

SQLインジェクション攻撃を検出するために、汎用SQLインジェクション防止ルールはスコアリングシステムを使用します。動作は次のとおりです。
  1. アプリケーションからのパケットは分析のためにDeep Security Agentに到着します。
  2. 一般的なSQLインジェクション防止ルールはパケットを調べ、以下の表に示されている文字列が含まれているかどうかを判断します。文字列はコンマで区切られ、10のグループに分けられていることに注意してください。
  3. 文字列が見つかった場合、スコアが次のように計算されます。
    • 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
    • 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが加算されます。
    • 同じグループに複数の文字列が見つかった場合、そのグループのスコアは一度だけカウントされます。詳しくは、ルールとスコアリングシステムの例をご覧ください。
  4. 総合スコアを使用して、Deep Securityは接続を切断するかログに記録するかを判断します。総合スコアが[ドロップ閾値]スコアを超えると、接続が切断され、[ログしきい値]スコアを超えると、ログに記録されます。
注意
注意
トレンドマイクロは頻繁にルールを更新するため、以下の表の文字列はDeep Security Managerのものと完全に一致しない場合があります。
注意
注意
以下の行で '\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
version(,version%28,user(,user%28,system_user(,system_user%28,database(,database%28,@@hostname,%40%40hostname,@@basedir,%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
ドロップしきい値: 4
そしてこの攻撃文字列が検出されました:
productID=BB10735166+UNION/**/+SELECT+FROM+user
次の集計をして、合計スコアは5 (2+1+0+2) になります。
  • 文字列UNION/はスコア2で第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
ドロップしきい値: 4
そしてこの攻撃文字列が検出されました:
productID=BB10735166+UNION/**/+SELECT+FROM+user
次の集計をして、合計スコアは3 (2+1+0+0) になります。
  • 文字列UNION/はスコア2で第4グループに一致します。
  • 文字列/*は6番目のグループに一致し、スコアは1です。
  • 文字列*/は6番目のグループに一致し、スコアは0です (6番目のグループのスコアはすでにカウントされているため)。
  • 文字列SELECT+は、4番目のグループに一致し、スコアは0です (4番目のグループのスコアはすでにカウントされているため)。
合計スコアが3の場合、ログは生成されず、トラフィックもドロップされません。スコアが閾値を超える必要があります。

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

組織のニーズに合わせて、汎用SQLインジェクション防止ルールを設定できます。設定可能なオプションは以下の画像に表示されています。
ips-sql-injection-rule-details=f414a1fd-1ec2-4567-809f-a32f420b0701.png
ルールを設定するには、次の手順に従います。
  1. Deep Security Managerにログインします。
  2. 上部で、[ポリシー]をクリックします。
  3. 右側の検索ボックスに1000608を入力します。これはGeneric SQL Injection Preventionルールの数値識別子です。Enterキーを押します。ルールがメインペインに表示されます。
  4. ルールをダブルクリックします。
  5. [設定]タブをクリックします。上部のテキストボックスにSQLインジェクションパターンが表示されます。
  6. SQLインジェクションパターンを最新バージョンに更新してください。まだカスタマイズしていない場合は、最新のパターンに更新するには、[詳細]タブに移動し、[デフォルトSQLパターン]見出しの下のテキストをコピーして、[設定]タブの[SQLインジェクションパターン]テキストボックスに貼り付けます。これで、トレンドマイクロの最新パターンを使用しています。
  7. 次のようにフィールドを編集します。
    • [SQLインジェクションパターン]: ここでは、SQLインジェクション攻撃に使用される文字と文字列のリストを指定します。文字と文字列はグループ化され、スコアが割り当てられます。文字列を追加または変更する場合は、適切なエンコーディングを使用してください。詳細については、以下の文字エンコーディングのルールを参照してください。
    • [ドロップ閾値]: ここでドロップスコアを指定します。スコアがこの閾値を超えると接続が切断されます。(スコアがドロップ閾値と等しい場合、接続は維持されます。) デフォルトは4です。
    • [ログしきい値]: ここでログスコアを指定します。スコアがこの閾値を超えると接続がログに記録されます。(スコアがログ閾値と等しい場合、何も記録されません。) デフォルトは4です。
    • [一致間の最大距離]: ここでは、一致がなくスコアが0にリセットされるまでに通過できるバイト数を指定します。デフォルトは35です。
    • 注意
      注意
      通常のしきい値を超える可能性のあるページやフィールドに対してオーバーライドを作成するには、次の2つのオプションを使用することを検討してください。
    • [デフォルト以外のスコアを持つページ (リソース) をドロップする]: これは特定のリソースに対して[ドロップ閾値]を上書きする場所です。例えば、[ドロップ閾値]4であるが、アンケートページに対して 8 のドロップスコアを設定したい場合、/example/questionnaire.html:8と指定します。この設定では、/example/questionnaire.htmlは接続が切断されるためには8を超えるスコアが必要ですが、他のすべてのリソースは4を超えるスコアが必要です。各リソースを別々の行に指定してください。
    • [非デフォルトスコアのフォームパラメータをドロップする]: これは、特定のフォームフィールドに対して[ドロップ閾値]または[デフォルト以外のスコアが付いているページ (リソース) をドロップする]フィールドで定義されたしきい値を上書きできる場所です。例えば、[ドロップ閾値]スコアが4であるが、ユーザー名フィールドに対してより高いドロップスコア10を設定したい場合、/example/login.html:username=10と指定します。ここで、/example/login.htmlはユーザー名フィールドが表示されるページのパスと名前に置き換え、usernameはアプリケーションで使用されるユーザー名フィールドに置き換えます。この設定により、接続がドロップされるためにはユーザー名フィールドが10を超えるスコアを持つ必要がありますが、ページ自体は4を超えるスコアで十分です。各フォームフィールドを別々の行に指定してください。
    • [ログしきい値]は、[非デフォルトのスコアを持つページ (リソース) をドロップする]または[非デフォルトスコアのフォームパラメータをドロップする]フィールドで一致があったために接続が切断された場合には有効になりません。例えば、フォームパラメータフィールドを/example/login.html:username=10に設定し、usernameフィールドが11をスコアした場合、接続は切断されますが、このイベントのログは記録されません。
  8. [OK] をクリックします。
汎用SQLインジェクション防止ルールを設定しました。

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

Generic SQL Injection Preventionルールに文字列を変更または追加したい場合は、適切にエンコードする必要があります。例えば、パターンに引用符文字 ' を使用したい場合は、\x22と入力する必要があります。
以下の表は、文字とそのエンコードされた同等物、および拡張パターンを示すために使用できる文字クラスを示しています。
この文字列を入力してください...
示すために...
\a
\A
英字 (a~z A~Z)
英字以外の文字
例: delete\a は「'delete'の後にアルファベット文字が続く」という意味です
\w
\W
英数字 (a~z A~Z 0~9)
英数字以外の文字
例: delete\W は「'delete'という単語の後に非英数字が続く」という意味です
\d
\D
数字 (0~9)
数字以外の文字
例: delete\d は「'delete'という単語の後に0から9までの数字が続く」という意味です
\s
\S
空白文字
空白でない [\r,\n,\t、0x32]
例: delete\S は「'delete'の後に空白以外の文字が続く」という意味です
\p
\P
句読文字、上記以外の印字可能なASCII文字
句読文字以外の文字
例: delete\p は「句読点または印刷可能なASCII文字が続く 'delete'」を意味します
\c
\C
制御文字 (ASCIIの32番より前または127番以降、空白文字は含まない)
non-control character
制御文字の詳細についてはこちらをご覧ください。
\.
any
\xDD
16進数のバイト0xDD
\x2c
カンマ (,)
\x22
2重引用符 (")
\\
エスケープされたバックスラッシュ (\)
\|
エスケープされたパイプ (|)
|xx xx xx...|
16進数パイプ (バイトシーケンス)