Google ウェブツールキットのウェブアプリファイアウォールのサポート
注: この機能はNetScalerリリース10.5.eで使用できます。
Google Web Toolkit(GWT)のリモートプロシージャコール(RPC)メカニズムを使用するWebサーバーは、GWTサポートを有効にするための特別な構成を必要とせずに、NetScaler Web App Firewallで保護できます。
GWTとは何か
GWTは、XMLHttpRequestやJavaScriptの専門知識を持たないユーザーでも、複雑で高性能なウェブアプリケーションの構築と最適化に使用されます。このオープンソースの無料開発ツールキットは、小規模および大規模なアプリケーションの開発に広く使用されており、フライトやホテルなどの検索結果などのブラウザベースのデータを表示するために非常に頻繁に使用されます。GWTには、ほとんどのブラウザやモバイルデバイスで実行できる最適化されたJavaScriptスクリプトを作成するためのJava APIとウィジェットのコアセットが用意されています。GWT RPC フレームワークを使用すると、Web アプリケーションのクライアントコンポーネントとサーバーコンポーネントが HTTP 経由で Java オブジェクトを簡単に交換できます。GWT RPC サービスは、SOAP または REST に基づくウェブサービスとは異なります。これらは単純に、サーバーとクライアント上の GWT アプリケーションの間でデータを転送するための軽量な方法です。GWTは、メソッド呼び出しの引数と戻り値を交換するJavaオブジェクトのシリアル化を処理します。
GWT を使用する人気の Web サイトについては、以下を参照してください。
https://www.quora.com/What-web-applications-use-Google-Web-Toolkit-%28GWT%29
GWT リクエストの仕組み
GWT RPC リクエストはパイプで区切られ、引数の数は可変です。HTTP POST のペイロードとして送信され、値は次のとおりです。
- コンテンツタイプ = テキスト/x-gwt-rpc。Charset には任意の値を指定できます。
- メソッド = POST
コンテンツタイプが「text/x-gwt-rpc」の場合、HTTP リクエストの GET リクエストと POST HTTP リクエストの両方が有効な GWT リクエストと見なされます。クエリ文字列が GWT リクエストの一部としてサポートされるようになりました。コンテンツタイプ「text/x-gwt-rpc」のリクエストクエリ部分を調べるには、アプリファイアウォールプロファイルの「InspectQueryContentTypes」パラメーターを「OTHER」に設定します。
次の例は、GWT リクエストの有効なペイロードを示しています。
5|0|8|http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer| myInput1|java.lang.Integer/3438268394|1|2|3|4|2|5|6|7|8|1|
<!--NeedCopy-->
リクエストは次の 3 つの部分に分けることができます。
a) Header: 5|0|8|
上記のリクエストの最初の3桁5|0|8|
は、それぞれ「バージョン、サブバージョン、テーブルのサイズ」を表しています。これらは正の整数でなければなりません。
b) 文字列テーブル:
http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer|myInput1| java.lang.Integer/3438268394|
上記のパイプで区切られた文字列テーブルのメンバーには、ユーザー指定の入力が含まれています。これらの入力は Web App Firewall のチェック用に解析され、次のように識別されます。
-
1st :
http://localhost:8080/test/
これはリクエスト URL です。
-
2nd :
16878339F02B83818D264AE430C20468
一意の HEX 識別子。この文字列に 16 進数以外の文字が含まれている場合、リクエストは形式が誤っていると見なされます。
-
3rd :
com.test.client.TestService
サービスクラス名
-
4th :
testMethod
サービスメソッド名
-
5th onwards:
java.lang.String|java.lang.Integer|myInput1|java.lang.Integer/3438268394
データ型とデータ。非プリミティブデータ型は次のように指定されます
<container>.<sub-cntnr>.name/<integer><identifier>
c) Payload: 1|2|3|4|2|5|6|7|8|1|
ペイロードは、文字列テーブル内の要素への参照で構成されています。これらの整数値は、文字列テーブルの要素数より大きくすることはできません。
GWT アプリケーションの Web アプリケーションファイアウォール保護
Web App Firewall は GWT RPC リクエストを理解して解釈し、ペイロードにセキュリティチェック違反がないか検査し、指定されたアクションを実行します。
GWT リクエストの Web App Firewall ヘッダーと Cookie チェックは、他のリクエスト形式のものと同様です。適切な URL デコードと文字セット変換の後、文字列テーブルのすべてのパラメータが検査されます。GWT リクエストボディにはフィールド名は含まず、フィールド値のみが含まれます。Web App Firewall Field Format チェックを使用して、入力値を指定された形式と照合できます。このチェックを使用して入力の長さを制御することもできます。 **入力に対するクロスサイトスクリプティング攻撃やSQLインジェクション攻撃は** 、Web App Firewallで簡単に検出して阻止できます。
学習ルールと緩和ルール:GWT リクエストでは、緩和ルールの学習と展開がサポートされています。Web App Firewall ルールは<actionURL><gieldName> マッピングの形式です。GWT リクエスト形式にはフィールド名がないため、特別な処理が必要です。Web App Firewall は、学習したルールにダミーフィールド名を挿入し、緩和ルールとして展開できます。-IsRegex フラグは、GWT 以外のルールの場合と同じように機能します。
-
アクション URL:
RPC に応答する複数のサービスを同じ Web サーバー上で設定できます。HTTP リクエストには、RPC を処理する実際のサービスの URL ではなく、Web サーバーの URL が含まれます。そのため、HTTP リクエスト URL に基づいて緩和は適用されません。これは、その URL 上のすべてのサービスが対象フィールドに対して緩和されるためです。GWT リクエストの場合、Web App Firewall は、文字列テーブルの 4 番目のフィールドにある GWT ペイロードにある実際のサービスの URL を使用します。
-
フィールド名:
GWT リクエスト本文にはフィールド値のみが含まれているため、Web App Firewall は学習したルールを推奨するときに 1、2 などのダミーフィールド名を挿入します。
GWT で学習したルールの例
POST /abcd/def/gh HTTP/1.1 Content-type: text/x-gwt-rpc Host: 10.217.222.75 Content-length: 157 5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|onblur| The learn data will be as follows: > sh learningdata pr1 crossSiteScripting Profile: pr1 SecurityCheck: crossSiteScripting 1) Url: http://localhost:8080/acdtest/ >> From GWT Payload. Field: 10 Hits: 1 Done <!--NeedCopy-->
GWT 緩和ルールの例
bind appfw profile pr1 -crossSiteScripting 1 abcd -isregex NOTREGEX
ログメッセージ:Web App Firewall は、GWT リクエストで検出されたセキュリティチェック違反のログメッセージを生成します。不正な形式の GWT リクエストによって生成されたログメッセージには、簡単に識別できるように「GWT」という文字列が含まれます。
不正な形式の GWT リクエストのログメッセージの例:
Dec 5 21:48:02 <local0.notice> 10.217.31.247 12/05/2014:21:48:02 GMT ns 0-PPE-0 : APPFW Message 696 0 : "GWT RPC request with malformed payload. <blocked>”
GWTリクエストと非 GWT リクエストの処理の違い:
同じペイロードでも、コンテンツタイプごとに異なる Web App Firewall セキュリティチェック違反が発生する可能性があります。次の例を考えてみましょう。
5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468|com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|select|
コンテンツタイプ:アプリケーション/x-www-form-URL エンコード:
SQL インジェクションタイプが利用可能な 4 つのオプション (sqlSplCharandKeyword、sqlSplCharorKeyword、SQLKeyword、または sqlSplchar) のいずれかを使用するように構成されている場合、このコンテンツタイプで送信されたリクエストは SQL 違反になります。Web App Firewall は、上記のペイロードを処理する際、「&」をフィールド区切り文字、「=」を名前と値の区切り文字と見なします。これらの文字はどちらも投稿本文のどこにも表示されないため、コンテンツ全体が単一のフィールド名として扱われます。このリクエストのフィールド名には、SQL 特殊文字 (;) と SQL キーワード (select) の両方が含まれています。そのため、4 つの SQL インジェクションタイプのオプションすべてで違反が検出されます。
Content-type: text/x-gwt-rpc:
このコンテンツタイプで送信されたリクエストが SQL インジェクションタイプを sqlSplCharorKeyword、SQLKeyword、または SQLSplChar の 3 つのオプションのいずれかに設定した場合にのみ SQL 違反がトリガーされます。SQL インジェクションタイプがデフォルトのオプションである sqlSplCharandKeyword に設定されていても、違反は発生しません。Web App Firewall は、 |
縦棒を GWT リクエスト内の上記のペイロードのフィールド区切り文字と見なします。そのため、投稿本文はさまざまなフォームフィールド値に分割され、(前述の規則に従って)フォームフィールド名が追加されます。この分割により、SQL 特殊文字と SQL キーワードは別々のフォームフィールドの一部になります。
フォームフィールド 8: java.lang.String%3b -\> %3b is the (;) char
フォームフィールド 10: select
そのため、SQL インジェクションタイプが sqlSplCharに設定されている場合、フィールド 8 は SQL 違反を示します。 SQLキーワードの場合、フィールド10は違反を示します。SQL Inject タイプに sqlSplCharorKeyword オプション(キーワードまたは特殊文字の有無を調べる )が設定されている場合、これら 2 つのフィールドのどちらかが違反を示している可能性があります。 **デフォルトの **sqlSplCharAndKeyword オプションでは違反は検出されません。これは、sqlSplChar と sqlKeyword の両方を含む値を持つ単一のフィールドはないためです。**
ヒント:
- GWT サポートを有効にするために特別な Web App Firewall を設定する必要はありません。
- コンテンツタイプは text/x-gwt-rpc でなければなりません。
- GWT ペイロードに適用されるすべての関連する Web App Firewall セキュリティチェックの緩和ルールを学習してデプロイすることは、サポートされている他のコンテンツタイプの場合と同じように機能します。
- POST リクエストのみが GWT で有効と見なされます。コンテンツタイプが text/x-gwt-rpc の場合、他のすべてのリクエストメソッドはブロックされます。
- GWT リクエストには、設定されているプロファイルの POST 本文制限が適用されます。
- セキュリティチェックのセッションレス設定は適用されないため無視されます。
- GWT ログメッセージでは CEF ログ形式がサポートされています。