このページのトピック
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
汎用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: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ルールを設定する
組織のニーズに合わせて汎用SQLインジェクション防御ルールを設定できます。次の図は、設定可能なオプションを示しています。
ルールを設定するには、次の手順に従います。
- Workload Security コンソールにログインします。
- 画面上部の [ポリシー] をクリックします。
- 右側の検索ボックスに、汎用SQLインジェクション防御ルールの数値識別子である「1000608」と入力します。 Enter キーを押します。ルールがメインペインに表示されます。
- ルールをダブルクリックします。
- [設定] タブをクリックします。SQLインジェクションパターンは、上部のテキストボックスに表示されます。
- SQLインジェクションパターンをカスタマイズしていない場合は、最新バージョンでアップデートします。最新のパターンにアップデートするには、[ Details] タブに移動し、[ Default SQL Pattern ] 見出しの下のテキストをコピーして、[ Configuration ] タブの [ SQL Injection Patterns ] テキストボックスに貼り付けます。これで、トレンドマイクロの最新のパターンファイルを使用できます。
-
次のようにフィールドを編集します。
- SQLインジェクションパターン: SQLインジェクション攻撃で使用される文字と文字列のリストを指定します。文字と文字列はグループ化され、スコアが割り当てられます。文字列を追加または変更する場合は、適切なエンコーディングを使用してください。詳細については、文字コードルール を参照してください。
- ドロップしきい値: ドロップスコアを指定します。スコアがこのしきい値を超えると、接続が切断されます。スコアがドロップしきい値に等しい場合、接続は維持されます。初期設定は
4
です。 - 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
の場合、接続は切断されますが、このイベントのログはありません。 -
[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進数パイプ (バイトシーケンス) |