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

SQLインジェクション攻撃について
SQLインジェクション攻撃、またはSQLフィッシング攻撃は、データ駆動型アプリケーションを攻撃する方法の一つで、攻撃者が入力フィールドにSQL文の一部を含めるものです。新たに形成された不正なSQLコマンドは、ウェブサイトによってデータベースに渡され、実行されます。このコマンドにより、攻撃者はデータベース内の情報を読み取ったり、追加、削除、変更したりすることが可能になります。
SQLインジェクション攻撃で使用される一般的な文字と文字列
以下は、一般的に使用される文字と文字列の完全なリストではありません。
('
%27
\x22
%22
char
;
ascii
%3B
%2B
--
%2D%2D
/*
%2F%2A
*/
%2A%2F
substring
テーブルを削除
drop+table
insert into
insert+into
バージョン (
値
グループ化
group+by
テーブルを作成する
テーブルを作成
削除
更新
一括挿入
bulk+insert
load_file
シャットダウン
ユニオン
持っている
選択
宣言
exec
および
または
like
@@hostname
@@tmpdir
は null です
is+null
is not null
は+null+ではない
%3D
CONCAT
%40%40basedir
バージョン%28,ユーザ (
ユーザ%28,system_user (
(,%28,)
%29
@
%40
キャスト
汎用SQLインジェクション防御ルールについて
SQLインジェクション攻撃を検出するために、汎用SQLインジェクション防御ルールではスコアリングシステムを使用します。次のように機能します。
- アプリケーションからのパケットは、分析のためにエージェントに到着します。
- 汎用SQLインジェクション防御ルールはパケットを調べ、次の表に示す文字列が存在するかどうかを判断します。文字列はカンマで区切られ、10個のグループに分けられます。
- 文字列が見つかった場合、スコアが次のように計算されます。
- 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
- 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが加算されます。
- 同じグループに複数の文字列が見つかった場合、そのグループのスコアは1回のみカウントされます。詳細についてはルールとスコアリングシステムの実例を参照してください。
- 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
|
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:2declare\W,select\W:2cast\W,exec\W,load_file:2union\W,group
by,group+by,order by,order+by,having\W:2and\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:1ascii,substring:1version(,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:2Log
Threshold: 3Drop Threshold:4
次の攻撃文字列が検出されました。
productID=BB10735166+UNION/**/+SELECT+FROM+ユーザ
次の集計をして、合計スコアは5 (2+1+0+2) になります。
- 文字列
UNION/
は4番目のグループに一致し、スコアは2です。 - 文字列
/*
は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:2declare\W:2cast\W,exec\W,load_file:2union\W,select\W,group
by,group+by,order by,order+by,having\W:2and\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:1ascii,substring:1version(,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:2Log
Threshold: 3Drop Threshold:4
次の攻撃文字列が検出されました。
productID=BB10735166+UNION/**/+SELECT+FROM+ユーザ
次の集計をして、合計スコアは3 (2+1+0+0) になります。
- 文字列
UNION/
は4番目のグループに一致し、スコアは2です。 - 文字列
/*
は6番目のグループに一致し、スコアは1です。 - 文字列
*/
は6番目のグループに一致し、スコアは0です (6番目のグループのスコアはすでにカウントされているため)。 - 文字列
SELECT+
は、4番目のグループに一致し、スコアは0です (4番目のグループのスコアはすでにカウントされているため)。
合計スコアが3の場合、ログは生成されず、トラフィックもドロップされません。スコアはそれらが有効になるためのしきい値を超える必要があります。
Generic SQL Injection Preventionルールを設定する
組織のニーズに合わせて汎用SQLインジェクション防御ルールを設定できます。次の図は、設定可能なオプションを示しています。

ルールを設定するには、次の手順に従います。
-
Workload Security コンソールにログインします。
-
画面上部の [ポリシー] をクリックします。
-
右側の検索ボックスに、汎用SQLインジェクション防御ルールの数値識別子である「1000608」と入力します。 Enter キーを押します。ルールがメインペインに表示されます。
-
ルールをダブルクリックします。
-
[設定] タブをクリックします。SQLインジェクションパターンは、上部のテキストボックスに表示されます。
-
SQLインジェクションパターンをカスタマイズしていない場合は、最新バージョンでアップデートします。最新のパターンにアップデートするには、[詳細] タブに移動し、[Default SQL Pattern] 見出しの下のテキストをコピーして、[SQL Injection Patterns] テキストボックスに貼り付けます。これで、[設定] タブのトレンドマイクロの最新のパターンファイルを使用できます。
-
次のようにフィールドを編集します。
- SQLインジェクションパターン: SQLインジェクション攻撃で使用される文字と文字列のリストを指定します。文字と文字列はグループ化され、スコアが割り当てられます。文字列を追加または変更する場合は、適切なエンコーディングを使用してください。詳細については、文字コードルール を参照してください。
- ドロップしきい値: ドロップスコアを指定します。スコアがこのしきい値を超えると、接続が切断されます。スコアがドロップしきい値に等しい場合、接続は維持されます。初期設定は
4
です。 - ログのしきい値: ここでログスコアを指定します。スコアがこのしきい値を超えると、接続がログに記録されます。スコアがログのしきい値に等しい場合、ログは記録されません。初期設定は
4
です。 - 一致間の最大距離: スコアを
0
にリセットする場合の一致の最大間隔をバイト数で指定します。初期設定は35
です。
次の2つのオプションを使用して、通常のしきい値を超える可能性のあるページとフィールドのオーバーライドを作成することを検討してください。- 非デフォルトのスコアを持つページ (リソース) をドロップする: 特定のリソースについては [ドロップしきい値] をオーバーライドできます。たとえば、 [ドロップしきい値] が
4
で、アンケートページのドロップスコア8
を希望する場合は、/example/questionnaire.html:8
を指定します。この設定では、/example/questionnaire.html
のスコアは より大きい必要があります8
接続をドロップするために必要がありますが、他のすべてのリソースは4
よりも高いスコアを必要とします。リソースは1行に1つ指定します。 - 既定以外のスコアをドロップするフォームパラメータ: [ドロップしきい値] または [デフォルト以外のスコアをドロップするページ(リソース)] フィールドで定義したしきい値を特定のフォームフィールドについてはオーバーライドできます。たとえば、 [ドロップしきい値] のスコアが
4
の場合、ユーザ名フィールドの10
のドロップスコアを高くする場合は、/example/login.html:username=10
を指定します。ここで、/example/login.html
は、ユーザ名フィールドが表示されるページのパスと名前、およびusername
に置き換えられます。アプリケーションで使用されるユーザ名フィールドに置き換えられます。この設定では、ユーザ名フィールドの値は (10
より大きい値) に設定する必要がありますが、ページ自体は4
よりも高いスコアしか必要としません。フォームフィールドは1行に1つ指定します。
[ログのしきい値]接続が一致したため接続が切断された場合には有効になりません。[デフォルト以外のスコアをドロップするページ (リソース)]または[既定以外のスコアをドロップするフォームパラメータ]フィールド。たとえば、フォームパラメータフィールドを/example/login.html:username=10
に設定し、ユーザ名フィールドのスコアが11
の場合、接続は切断されますが、このイベントのログはありません。 -
[OK]をクリックします。
Generic SQL Injection Preventionルールが設定されました。
文字エンコードのガイドライン
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「delete」という単語の後に句読点または印刷可能なASCII文字が続くことを意味します |
\c
\C
|
制御文字 (ASCIIの32番より前または127番以降、空白文字は含まない)
non-control character
制御文字の詳細についてはこちらをご覧ください。
|
\.
|
任意
|
\xDD
|
16進数のバイト0xDD
|
\x2c
|
カンマ (,)
|
\x22
|
2重引用符 (")
|
\\
|
エスケープされたバックスラッシュ (\)
|
\|
|
エスケープされたパイプ (|)
|
|xx xx xx...|
|
16進数パイプ (バイトシーケンス)
|