1. 概要
過去 2 年間、セキュリティ専門家はネットワーク アプリケーション層での攻撃にもっと注意を払う必要がありました。なぜなら、ファイアウォール ルールがどれほど強力であっても、パッチ適用にどれほど熱心であっても、Web アプリケーション開発者が安全なコードに従っていない場合、攻撃者はポート 80 を介してシステムに侵入することになるからです。広く使用されている 2 つの主な攻撃手法は、SQL インジェクション [ref1] 攻撃と CSS [ref2] 攻撃です。 SQL インジェクションとは、インターネット入力領域を介して SQL メタキャラクター (一部のデータを表す特殊文字) と命令を挿入し、バックエンド SQL クエリの実行を操作する手法を指します。これらの攻撃は主に他の組織の WEB サーバーをターゲットとしています。 CSS 攻撃では、スクリプト タグを URL に挿入し、そのタグを信頼するユーザーにクリックさせることで、悪意のある JavaScript コードが被害者のマシン上で確実に実行されるようにします。これらの攻撃は、ユーザーとサーバー間の信頼関係を利用します。実際、サーバーは入力と出力を検出しないため、JavaScript コードは拒否されません。
この記事では、SQL インジェクションと CSS 攻撃の脆弱性の検出手法について説明します。これら 2 種類の WEB ベースの攻撃については、攻撃の実行方法、その影響、これらの攻撃を防ぐためのプログラムをより適切に準備および設計する方法など、インターネット上で多くの議論が行われています。 ただし、これらの攻撃を検出する方法については十分な議論がありません。当社では、一般的なオープン ソースの IDS Snort [ref 3] を使用して、これらの攻撃を検出するためのルールに基づいて正規表現を作成します。ちなみに、Snort のデフォルトのルール設定には CSS を検出するメソッドが含まれていますが、これは簡単に回避できます。たとえば、ほとんどの場合、検出を避けるために、<script> の代わりに %3C%73%63%72%69%70% 74%3E などの 16 進エンコードを使用します。
パラノイアのレベルでの組織の能力に応じて、同じ攻撃を検出するために複数のルールを作成しました。考えられるすべての SQL インジェクション攻撃を検出したい場合は、単一引用符、セミコロン、二重ダッシュなどの既存の SQL メタ文字に注意を払うだけで済みます。 CSS 攻撃を検出するもう 1 つの極端な方法は、単純に HTML タグ内の山かっこに注意することです。しかし、これにより多くのエラーが検出されます。これを回避するには、ルールを変更して検出をより正確にする必要がありますが、それでもエラーは回避できません。
Snort ルールで pcre (Perl 互換正規表現) [ref4] キーワードを使用すると、各ルールは他のルール アクションの有無にかかわらず実行できます。これらのルールは、ネットワーク サーバー ログを確認するために grep (ドキュメント検索ツール) などの公開ソフトウェアでも使用できます。 ただし、WEB サーバーがユーザーの入力を日記に記録するのは、リクエストが GET として送信された場合のみです。リクエストが POST として送信された場合、日記には記録されません。
2. SQL インジェクションの正規表現
SQL インジェクション攻撃の正規表現を選択するときは、攻撃者がフォームを送信するか、Cookie フィールドを通じて SQL インジェクションを実行できることを覚えておくことが重要です。入力検出ロジックでは、ユーザーによって整理されたさまざまなタイプの入力 (フォームや Cookie 情報など) を考慮する必要があります。また、ルールからの警告が多数発生している場合は、一重引用符やセミコロンに注意してください。これらの文字は、Web アプリケーションによって作成される Cookie に有効な入力である可能性があります。したがって、特定の Web アプリケーションに対して各ルールを評価する必要があります。
前述したように、SQL インジェクション攻撃を検出するための詳細な正規表現では、一重引用符 (') や二重展開記号 (--) などの SQL の特殊なメタ文字に注意を払う必要があります。
2.1 SQL メタ文字を検出するための正規
表現
/(%27)|(')|(--)|(%23)|(#)/ix
説明:
まず、同等の一重引用符、一重引用符自体、または二重引用符の 16 進数をチェックします。展開記号。これらは MS SQL Server または Oracle の文字で、以下がコメントであり、後続のコメントはすべて無視されることを示します。 さらに、MySQL を使用する場合は、「#」とそれに相当する 16 進数の出現に注意する必要があります。これは HTML メタ文字ではなく、ブラウザによってエンコードされないため、二重ダッシュに相当する 16 進数をチェックする必要がないことに注意してください。 また、攻撃者が (Achilles [ref 5] のようなプロキシを使用して) 二重ダッシュを 16 進数値 %2D に手動で変更できた場合、SQL インジェクションは失敗します。
上記の正規表現に追加された新しい Snort ルールは次のとおりです。alert
tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,published;uricontent:".pl";pcre:
"/ (%27)|(')|(--)|(%23)|(#)/i"; クラスタイプ:Web アプリケーション攻撃; sid:9099;)
この記事の説明では、uricontent キーワードの値は「.pl」です。これは、テスト環境では CGI プログラムが Perl で記述されているためです。 uricontent キーワードの値は、特定のアプリケーションによって異なります。この値は、「.php」、「.asp」、「.jsp」などになります。 この観点から、対応する Snort ルールは示しませんが、これらのルールを作成する正規表現を示します。 これらの正規表現を使用して、多くの Snort ルールを簡単に作成できます。前の正規表現では、一重引用符がない場合でも SQL インジェクション ポイントが存在する可能性があるため、二重ダッシュが検出されました [参照 6]。 たとえば、SQL クエリ エントリには次のように数値のみが含まれます:
select value1、value2、num_value3 from database
where num_value3=some_user_supplied_number
この場合、攻撃者は次の入力を実行できます:
3; some_other_table に値を挿入します 最後に、pcre 修飾子 'i' と 'x' を使用して大文字と小文字を一致させます
。
空白はそれぞれ無視します。 上記のルールをさらに拡張して、セミコロンの存在をチェックすることもできます。ただし、セミコロンは通常の HTTP 応答の一部である可能性があります。このエラーを減らし、一重引用符や二重展開記号が通常発生するのを防ぐために、最初に = 記号の存在を検出するように上記のルールを変更する必要があります。ユーザー入力は GET または POST リクエストに応答します。通常、入力は次のように送信されます。
username=some_user_supplied_value&password=some_user_supplied_value
したがって、SQL インジェクション試行により、ユーザーの入力は a = 記号またはそれに相当する 16 進値の後に表示されます。
2.2 SQL メタ文字を検出するための正規表現を修正する
/((%3D)|(=))[^n]*((%27)|(')|(--)|( %3B)|(:))/i
説明:
このルールは、最初に = 記号またはその 16 進値 (%3D) に注目し、次に改行を除く 0 個以上の文字を考慮し、最後に一重引用符と二重ダッシュを検出します。セミコロン。
一般的な SQL インジェクションでは、有用な値を取得するために、一重引用符を使用して元のクエリを操作しようとします。この攻撃は一般に 1'or'1'='1 文字列を使用して説明されますが、この文字列の検出は 1'or2>1 -- を使用するなどして簡単に回避できます。ただし、唯一の定数部分は の値です。最初の文字、一重引用符の後に「or」を追加します。以下のブール ロジックは、一般的なものから非常に複雑なものまで、さまざまなスタイルで異なる場合があります。これらの攻撃は、次の正規表現を使用すると非常に正確に検出できます。 2.3 章で説明します。
2.3 典型的な SQL インジェクション攻撃の正規表現
/w*((%27)|('))((%6F)|o|(%4F))((%72)|r| (% 52))/ix
説明:
w* - 0 個以上の文字またはアンダースコア。
(%27)|' - 一重引用符またはそれに相当する 16 進数。
(%6 F)|o|(%4 F))((%72)|r|-(%52) - 'or' とそれに相当する 16 進数のケース
SQL インジェクションにおける Union'SQL クエリ攻撃はさまざまなデータベースでも非常に一般的です。前の正規表現が単一引用符またはその他の SQL メタ文字を検出するだけの場合は、単一引用符とキーを検出するようにクエリをさらに変更する必要があります。また、「select」、「insert」、「update」、「delete」などの他の SQL キーワードを使用してさらに拡張することもできます。
2.4 SQL インジェクション、UNION クエリ キーワードの正規表現の検出
/ ((%27)|(') )union/ix
(%27)|(') - 一重引用符とそれに相当する 16 進数
Union - Union キーワードは
、他の SQL クエリ (>select、insert、update、delete、drop など) の式をカスタマイズするためにも使用できます。
この段階までに、攻撃者が Web アプリケーションに SQL インジェクションがあることを発見した場合、脆弱性を利用しようとするでしょう。バックエンド サーバーが MS SQL サーバーであることが分かると、通常、危険なストレージや拡張ストアド プロシージャを実行しようとします。これらの手順は通常、文字「sp」または「xp」で始まります。通常、ユーザーは「xp_cmdshell」拡張ストアド プロシージャ (SQL Server 経由で Windows コマンドを実行する) を実行しようとします。これらのコマンドを実行する権限は、SQL サーバーの SA 権限にあります。同様に、xp_regread、xp_regwrite、およびその他のストアド プロシージャを通じてレジストリを変更できます。
2.5 MS SQL Server SQL インジェクション攻撃を検出するための正規表現
/exec(s|+)+(s|x)pw+/ix
の説明:
exec - ストアドまたは拡張ストアド プロシージャの実行を要求するキーワード
(s|+)+ - 1 つ以上の空白またはそれに相当する http
(s|x) p-「sp」または「xp」文字は、ストレージまたは拡張ストレージ手順を識別するために使用されます。
w+ - プロシージャの名前と一致する 1 つ以上の文字またはアンダースコア
3. クロスサイト スクリプティング (CSS) の正規表現
CSS 攻撃を開始する場合、または Web サイトの脆弱性を検出する場合、攻撃者は最初に次のような単純な HTML タグを作成する可能性があります。 < b> (太字)、<i> (イタリック体)、または <u> (下線)、または、<script>alert("OK")</script> のような単純なスクリプト タグを試すこともできます。 Web サイトにインターネットを通じて伝播する CSS 脆弱性があるかどうかを検出するための例として使用されます。このような試みは簡単に検出できます。 ただし、賢い攻撃者は文字列全体を 16 進値に置き換える可能性があります。このように、<script> タグは %3C%73%63%72%69%70%74%3E として表示されます。 一方、攻撃者は、Achilles のような Web プロキシ サーバーを使用して、< から %3C、> から %3E などの一部の特殊文字を自動的に変換する可能性があります。このような攻撃が発生すると、通常、山括弧は 16 進数値に置き換えられます。 URLにある。
次の正規表現は、HTML 内の <、> を含むテキストを検出します。 <b>、<u>、または <script> を使用しようとする試みを捕捉します。この正規表現では大文字と小文字を区別する必要があります。山かっことそれに相当する 16 進数 (% 3C|<) の両方を検出する必要があります。 16 進数に変換された文字列全体を検出するには、ユーザーが入力した数字と % 記号を検出する必要があります ([a-z0-9%] を使用します)。これにより、いくつかのバグが発生する可能性がありますが、ほとんどは実際の攻撃を検出しません。
3.1 一般的な CSS 攻撃の正規表現
/((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)/ix
Explain :
((%3C)|<) - < とそれに相当する 16 進数をチェックします
((%2F)|/)* - 終了タグ/ またはそれに相当する 16 進数
[a-z0-9%]+ - タグ内の文字またはそれに相当する 16 進数を確認します。
((%3E)|>) - > またはそれに相当する 16 進数の
Snort ルールを確認します。
アラート tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII クロスサイト スクリプティング試行"; flow:to_server,確立; pcre:"/((%3C)|<)((%2F)| /)*[a-z0-9%]+((%3E)|>)/i"; classtype:Web-application-攻撃; sid:9000; rev:5;)
クロスサイト スクリプティングも可能です。使用されている< img src=>テクノロジー。現在のデフォルトの Snort ルールは簡単に回避できます。
セクション 3.2 では、この手法を防ぐ方法を説明します。
3.2 "<img src" CSS 攻撃正規表現
/((%3C)|<)((%69)|i|(%49))((%6D)|m|(%4D) ) ((%67)|g|(%47))[^n]+((%3E)|>)/I
説明:
(%3 C)|<) -<またはそれに相当する 16 進数
(%69)|i|(%49))((%6D)|m|(%4D))((%67)|g|(%47) -'img' 文字またはそれ大文字と小文字の 16 進表記のバリエーションの組み合わせ
[^n]+ - <img に続く改行を除く任意の文字
(%3E)|>) -> またはそれに相当する 16 進数
3.3 CSS 攻撃の極端な正規表現
/((%3C)|<)[^n]+((%3E)|>) /I
説明:
これルールは単純に <+改行文字を除く任意の文字+> を検索します。 Web サーバーと Web アプリケーションのアーキテクチャによっては、このルールによりエラーが発生する可能性があります。ただし、CCS または CSS に似た攻撃は確実にキャッチします。
概要:
この記事では、SQL インジェクションとクロスサイト スクリプティング攻撃を検出するためのさまざまな種類の正規表現ルールを提案しました。一部のルールは単純かつ極端であり、攻撃される可能性があると警戒が高まります。しかし、このような極端なルールは、事前のエラーにつながる可能性があります。これを念頭に置いて、これらの単純なルールを変更して追加のスタイルを使用し、より正確にチェックできるようにしました。これらのネットワーク アプリケーションに対する攻撃を検出する場合、IDS またはログ分析方法をデバッグするための開始点としてこれらを使用することをお勧めします。さらにいくつかの修正を加えた後、通常のネットワーク トランザクション部分に対する悪意のない応答を評価した後、これらの攻撃を検出する準備が整います。
参考資料
1. SQL インジェクション
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
2. クロスサイト スクリプティングに関する FAQ http://www.cgisecurity.com/articles/xss -
faq.shtml
3. Snort IDS http://www.snort.org
4. Perl 互換の正規表現 (pcre) http://www.pcre.org
5. Web アプリケーション プロキシ、Achilles http://achilles.mavensecurity.com
3. 高度な SQL インジェクション
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
7. セキュア プログラミング HOWTO、David Wheeler www.dwheeler.com
8. 脅威と対策、MSDN、Microsoft