本ヘルプセンターは英語版を翻訳したものです。また、一部には翻訳ソフトウエアにより機械的に翻訳した内容が含まれます。翻訳については順次対応しておりますが、最新の情報になっていない場合があります。最新の情報は英語版のページでご確認ください。表示言語は、画面右上の言語名をクリックして切り替えられます。
本ヘルプセンターの一部の記事には外部リンクが含まれています。万一リンク切れなどお気づきの点がございましたら、お手数ですが弊社サポート窓口までご連絡ください。
SQLインジェクション防御ルールの設定
Deep Securityの侵入防御モジュールには、SQLインジェクション攻撃を検出するルールが搭載されており、その特徴に応じて接続を破棄するか、ログに記録します。このルールは [1000608 - Generic SQL Injection Prevention] と呼ばれており、組織のニーズに合うように設定できます。たとえば、ルールの感度を変更するには、破棄のしきい値を変更します。
この記事のトピック:
- SQLインジェクション攻撃とは
- SQLインジェクション攻撃に共通する文字および文字列
- Generic SQL Injection Preventionルールの仕組み
- ルールおよび評価システムの実例
- Generic SQL Injection Preventionルールを設定する
- 文字エンコードのガイドライン
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ルールの仕組み
Generic SQL Injection Preventionルールは、評価システムを使用してSQLインジェクション攻撃を検出します。ルールは次のように動作します。
- アプリケーションからDeep Security Agentにパケットが到着し、分析されます。
- Generic SQL Injection Preventionルールでは、パケットを検査して以下の表に示す文字列があるかどうかを確認します。文字列はカンマで区切られ、10個のグループに分類されています。
- 文字列が見つかった場合、スコアが次のように計算されます。
- 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
- 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが合計されます。
- 複数の文字列が同じグループに見つかった場合、そのグループのスコアは1度だけ加算されます。
詳細については、ルールおよび評価システムの実例を参照してください。
- 合計スコアを使用して、Deep Securityは接続を中断するか、ログに記録するかを決定します。合計スコアが破棄のしきい値スコアを超えた場合、接続は中断されます。ログしきい値スコアを超えた場合は、ログに記録されます。
Trend Microによってルールが頻繁にアップデートされるため、以下の表の文字列は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
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番目のグループに一致するためスコアは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: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番目のグループに一致するためスコアは2。
- 文字列/*は6番目のグループに一致するためスコアは1。
- 文字列*/は6番目のグループに一致するためスコアは0 (6番目のグループのスコアは加算済み)。
- 文字列SELECT+は4番目のグループに一致するためスコアは0 (4番目のグループのスコアは加算済み)。
合計スコアは3で、ログは生成されず、トラフィックは破棄されません。ログや破棄が発生するには、スコアがしきい値を超える必要があります。
Generic SQL Injection Preventionルールを設定する
Generic SQL Injection Preventionルールを組織のニーズに合うように設定できます。設定可能なオプションを次の図に示します。
ルールを設定するには、次の手順に従います。
- Deep Security Managerにログインします。
- 画面上部の [ポリシー] をクリックします。
- 右側にある検索ボックスにGeneric SQL Injection Preventionの番号IDの「1000608」を入力します。Enterキーを押します。メイン画面にルールが表示されます。
- ルールをダブルクリックします。
- [設定] タブをクリックします。画面上部のテキストボックスにSQLインジェクションパターンが表示されます。
- カスタマイズをまだしていない場合は、このSQLインジェクションパターンを最新のバージョンにアップデートします。最新のパターンにアップデートするには、[詳細] タブに移動し、[Default SQL Pattern] 見出しの下のテキストをコピーし、[設定] タブの [SQL Injection Patterns] テキストボックスに貼り付けます。これで、トレンドマイクロの最新のパターンを使用できます。
- 次のようにフィールドを編集します。
- 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] をオーバーライドできます。たとえば、[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 (resource) with a non-default score to drop on] フィールドで定義したしきい値を特定のフォームフィールドについてはオーバーライドできます。たとえば、[Drop Threshold] スコアは4ですが、ユーザ名フィールドについては破棄スコアを高くして10にする場合は、/example/login.html:username=10を指定します。ここで、/example/login.htmlはユーザ名フィールドが表示されるページのパスと名前に置き換え、usernameはアプリケーションで使用するユーザ名フィールドに置き換えます。この設定では、接続が中断される場合、ユーザ名フィールドではスコアが10より高くなる必要がありますが、ページ自体では4を超えると中断されます。フォームフィールドは1行に1つ指定します。
- [Log Threshold] は、[Pages (resource) with a non-default score to drop on] や [Form parameters with a non-default score to drop on] フィールドによる接続の中断時には有効になりません。たとえば、Form parametersフィールドを/example/login.html:username=10に設定していて、usernameフィールドのスコアが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番以降、空白文字は含まない) 制御文字以外の文字 |
\. |
任意 |
\xDD |
16進数のバイト0xDD |
\x2c |
カンマ文字 (,) |
\x22 |
2重引用符 (") |
\\ |
エスケープされたバックスラッシュ (\) |
\| |
エスケープされたパイプ (|) |
|xx xx xx...| |
16進数パイプ (バイトシーケンス) |