IPSモジュールには、SQLインジェクション攻撃を検出し、特性に応じて接続を切断またはログに記録する組み込みルールが含まれています。このルールは[1000608 - 一般的なSQLインジェクション防止]と呼ばれ、組織のニーズに合わせて設定できます。例えば、ドロップ閾値を変更することでルールの感度を調整できます。
ips-sql-injection-rule=d0e54234-8636-41e5-bed2-fb02ec345745.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
  • バージョン (
  • 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
  • バージョン%28,ユーザ (
  • user%28,system_user(
  • (,%28,)
  • %29
  • @
  • %40
  • cast

汎用SQLインジェクション防御ルールについて

SQLインジェクション攻撃を検出するために、汎用SQLインジェクション防御ルールではスコアリングシステムを使用します。次のように機能します。
  1. アプリケーションからのパケットは、分析のためにエージェントに到着します。
  2. 汎用SQLインジェクション防御ルールはパケットを調べ、次の表に示す文字列が存在するかどうかを判断します。文字列はカンマで区切られ、10個のグループに分けられます。
  3. 文字列が見つかった場合、スコアが次のように計算されます。
    • 1つの文字列が見つかった場合は、そのグループのスコアが合計スコアになります。
    • 複数の文字列が異なるグループで見つかった場合は、それらのグループのスコアが加算されます。
    • 同じグループに複数の文字列が見つかった場合、そのグループのスコアは1回のみカウントされます。詳細についてはルールとスコアリングシステムの実例を参照してください。
  4. 総合スコアを使用して、Workload Securityは接続を切断するかログに記録するかを決定します。総合スコアが[Drop Threshold]スコアを超える場合、接続は切断され、[ログしきい値]スコアを超える場合、ログに記録されます。
トレンドマイクロはルールを頻繁にアップデートするため、次の表の文字列は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インジェクション防御ルールを設定できます。次の図は、設定可能なオプションを示しています。
ips-sql-injection-rule-details=ce0dc99a-999e-42dd-b9b4-aa03be6dfaf6.png
ルールを設定するには、次の手順に従います。
  1. Workload Security コンソールにログインします。
  2. 上部で[ポリシー]をクリックします。
  3. 右側の検索ボックスに、汎用SQLインジェクション防御ルールの数値識別子である「1000608」と入力します。 Enter キーを押します。ルールがメインペインに表示されます。
  4. ルールをダブルクリックします。
  5. [設定]タブをクリックします。上部のテキストボックスにSQLインジェクションパターンが表示されます。
  6. SQLインジェクションパターンを最新バージョンに更新してください。まだカスタマイズしていない場合は、最新のパターンに更新するには、[詳細]タブに移動し、[デフォルトSQLパターン]見出しの下のテキストをコピーして、[設定]タブの[SQLインジェクションパターン]テキストボックスに貼り付けてください。これで、トレンドマイクロの最新のパターンを使用しています。
  7. 次のようにフィールドを編集します。
    • SQLインジェクションパターン: ここでは、SQLインジェクション攻撃に使用される文字と文字列のリストを指定します。文字と文字列はグループ化され、スコアが割り当てられます。文字列を追加または変更する場合は、適切なエンコーディングを使用してください。詳細については、文字エンコーディングのルールを参照してください。
    • ドロップしきい値: ここでドロップスコアを指定します。スコアがこのしきい値を超えると、接続が切断されます。スコアがドロップしきい値と等しい場合、接続は維持されます。デフォルトは4です。
    • ログしきい値: ここでログスコアを指定します。スコアがこの閾値を超えると接続がログに記録されます。スコアがログ閾値と等しい場合、何もログに記録されません。デフォルトは4です。
    • 一致間の最大距離: 一致せずにスコアを0にリセットするために通過できるバイト数を指定する場所です。デフォルトは35です。
    次の2つのオプションを使用して、通常のしきい値を超える可能性のあるページとフィールドのオーバーライドを作成することを検討してください。
    • 非デフォルトのスコアを持つページ (リソース) を削除する: 特定のリソースに対して[Drop Threshold]を上書きする場所です。例えば、[Drop Threshold]4である場合でも、アンケートページに対して8のドロップスコアを設定したい場合は、/example/questionnaire.html:8と指定します。この設定では、/example/questionnaire.htmlは接続がドロップされるためには8より高いスコアが必要ですが、他のすべてのリソースは4より高いスコアが必要です。各リソースを別の行に指定してください。
    • デフォルト以外のスコアを持つフォームパラメータを削除する: ここでは、特定のフォームフィールドに対して[Drop Threshold]または[Pages (resources)with a non-default score to drop on]フィールドで定義された閾値を上書きできます。たとえば、[Drop Threshold]スコアが4である場合でも、ユーザー名フィールドのドロップスコアを10にしたい場合は、/example/login.html:username=10を指定します。ここで、/example/login.htmlはユーザー名フィールドが表示されるページのパスと名前に置き換え、usernameはアプリケーションで使用されるユーザー名フィールドに置き換えます。この設定では、ユーザー名フィールドは接続をドロップするためにより高い10のスコアを持つ必要がありますが、ページ自体は4より高いスコアで十分です。各フォームフィールドは別の行に指定してください。
    [ログしきい値]は、[非デフォルトのスコアでドロップするページ (リソース)]または[非デフォルトのスコアを持つフォームパラメータをドロップする]フィールドで一致があったために接続が切断された場合には効果がありません。例えば、フォームパラメータフィールドを/example/login.html:username=10に設定し、usernameフィールドが11を記録した場合、接続は切断されますが、このイベントのログは残りません。
  8. [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 は「句読点または印刷可能なASCII文字が続く 'delete' という単語」を意味します
\c
\C
制御文字 (ASCIIの32番より前または127番以降、空白文字は含まない)
non-control character
制御文字の詳細についてはこちらをご覧ください。
\.
任意
\xDD
16進数のバイト0xDD
\x2c
カンマ (,)
\x22
2重引用符 (")
\\
エスケープされたバックスラッシュ (\)
\|
エスケープされたパイプ (|)
|xx xx xx...|
16進数パイプ (バイトシーケンス)