侵入防御モジュールには、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インジェクション攻撃を検出するために、汎用SQLインジェクション防御ルールではスコアリングシステムを使用します。次のように動作します。
- アプリケーションからのパケットは、分析のためにエージェントに到着します。
- 汎用SQLインジェクション防御ルールは、パケットを調べて、次の表に示す文字列が存在するかどうかを判断します。文字列はカンマで区切られ、10個のグループに分けられていることに注意してください。
- 文字列が見つかった場合、スコアが次のように計算されます。
- 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
- 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが加算されます。
- 同じグループで複数の文字列が見つかった場合、そのグループのスコアは1回だけカウントされます。参照ルールとスコアリングシステムの使用例を参照してください。
- Server & Workload Protection は、合計スコアを使用して、接続を切断するかログに記録するかを決定します。合計スコアが [廃棄しきい値] スコアを超えると接続が切断され、 [ログしきい値] スコアを超えるとログに記録されます。
注意トレンドマイクロはルールを頻繁にアップデートするため、次の表の文字列が Server & Workload Protectionの文字列と完全に一致しない場合があります。
|
注意の使用
\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+user
次の集計をして、合計スコアは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+user
次の集計をして、合計スコアは3 (2+1+0+0) になります。
- 文字列
UNION/
は4番目のグループと一致し、スコアは2です。 - 文字列
/*
6番目のグループと一致しますが、スコアは1です。 - 文字列
*/
6番目のグループと一致しますが、スコアは0になります (6番目のグループのスコアはすでにカウントされているため)。 - 文字列
SELECT+
4番目のグループと一致しますが、スコアは0になります (4番目のグループのスコアはすでにカウントされているため)。
合計スコアが3の場合、ログは生成されず、トラフィックは破棄されません。スコアを有効にするには、スコアがしきい値を超える必要があります。
Generic SQL Injection Preventionルールを設定する
組織のニーズに合わせて汎用SQLインジェクション防御ルールを設定できます。設定可能なオプションを次の図に示します。
ルールを設定するには、次の手順に従います。
-
Server & Workload Protection コンソールにログインします。
-
上部の [Policies]をクリックします。
-
右側の検索ボックスに、汎用SQLインジェクション防御ルールの数値識別子として「1000608」と入力します。 Enter キーを押します。ルールがメインペインに表示されます。
-
ルールをダブルクリックします。
-
[構成] タブをクリックします。上部のテキストボックスにSQLインジェクションパターンが表示されます。
-
SQLインジェクションパターンをカスタマイズしていない場合は、最新バージョンでアップデートします。最新のパターンにアップデートするには、 [詳細] タブに移動し、 [初期設定のSQLパターン] 見出しの下のテキストをコピーして、 [構成] タブの [SQLインジェクションパターン] テキストボックスに貼り付けます。これで、トレンドマイクロの最新のパターンファイルを使用できます。
-
次のようにフィールドを編集します。
- [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
。フォームフィールドはそれぞれ1行に分けて指定します。
注意
[ドロップするスコアがデフォルト以外のページ (リソース)] または [ドロップするデフォルト以外のスコアを持つフォームパラメータ] フィールドの一致によって接続が切断された場合、 [ログしきい値] は有効になりません。たとえば、フォームパラメータフィールドを/example/login.html:username=10
、およびユーザ名フィールドのスコア11
、接続が切断されましたが、このイベントのログはありません。 -
[OK]をクリックします。
これでGeneric SQL Injection Preventionルールの設定が完了しました。
文字エンコードのガイドライン
汎用SQLインジェクション防御ルールの文字列を変更または追加する場合は、適切にエンコードする必要があります。たとえば、引用符を使用する場合は、
'
パターンには、次のように入力する必要があります。\\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, ,0x32]
例:
delete\S「削除」の後に空白以外の文字が続くことを意味します。 |
\p
\P
|
句読文字、上記以外の印字可能なASCII文字
句読文字以外の文字
例:
delete\p「delete」の後に句読点または印刷可能なASCII文字が続くことを意味します。 |
\c
\C
|
制御文字 (ASCIIの32番より前または127番以降、空白文字は含まない)
制御文字以外の文字
制御文字の詳細を確認できます。ここ。
|
\.
|
任意
|
\xDD
|
16進数のバイト0xDD
|
\x2c
|
カンマ文字 (,)
|
\x22
|
2重引用符 (")
|
\\
|
エスケープされたバックスラッシュ (\)
|
\|
|
エスケープされたパイプ (|)
|
|xx xx xx...|
|
16進数パイプ (バイトシーケンス)
|