署名による JSON アプリケーションの保護
JavaScript オブジェクトノーテーション (JSON) は、JavaScript スクリプト言語から派生したテキストベースのオープンスタンダードです。JSON は、オブジェクトと呼ばれる単純なデータ構造や連想配列を人間が読める形式で表現する場合に適しています。XML の代替として機能し、主に Web アプリケーションとの通信用にシリアル化されたデータ構造を送信するために使用されます。JSON ファイルは通常、.json 拡張子を付けて保存されます。
JSONペイロードは、通常、 application/jsonとして指定されたMIMEタイプで送信されます。JSON のその他の「標準」コンテンツタイプは次のとおりです。
- application/x-javascript
- text/javascript
- text/x-javascript
- text/x-json
NetScaler Web App Firewall 署名によるJSONアプリケーションの保護
JSON リクエストを許可するために、次の show-command 出力に示すように、アプライアンスには JSON コンテンツタイプがあらかじめ設定されています。
> sh appfw jsonContentType
1) JSONContenttypevalue: "^application/json$" IsRegex: REGEX
Done
<!--NeedCopy-->
NetScaler Web App Firewallは、次のコンテンツタイプの投稿本文のみを処理します。
- アプリケーション/x-www-フォーム-URLエンコード
- multipart/form-data
- テキスト/x-gwt-rpc
application/json(またはその他の許可されたコンテンツタイプ)を含む他のコンテンツタイプのヘッダーで受信されたリクエストは、ヘッダー検査後にバックエンドに転送されます。このようなリクエストの投稿本文は、SQL やクロスサイトスクリプティングなどのプロファイルのセキュリティチェックが有効になっていても、セキュリティチェック違反の検査は行われません。
JSON アプリケーションを保護して違反を検出するには、Web App Firewall シグネチャを使用できます。許可されたコンテンツタイプヘッダーを含むすべてのリクエストは、Web App Firewall によって処理され、署名が照合されます。独自にカスタマイズした署名ルールを追加して JSON ペイロードを処理し、さまざまなセキュリティチェック検査 (クロスサイトスクリプティング、SQL、フィールドの一貫性など) を実行したり、ヘッダーや投稿本文の違反を検出し、特定のアクションを実行したりできます。
ヒント
他の組み込みデフォルトとは異なり、事前設定された JSON コンテンツタイプは CLI または GUI (GUI) を使用して編集または削除できます。JSON アプリケーションに対する正当なリクエストがブロックされ、コンテンツタイプ違反が発生する場合は、コンテンツタイプの値が正確に設定されていることを確認します。Web App Firewall がコンテンツタイプヘッダーを処理する方法の詳細については、「 コンテンツタイプの保護」を参照してください。
コマンドラインインターフェイスを使用して JSON コンテンツタイプを追加または削除するには
コマンドプロンプトで、次のコマンドのいずれかを入力します。
add appfw jsonContentType ^application/json$ IsRegEx REGEX
rm appfw JSONContentType "^application/json$"
GUI を使用して JSON コンテンツタイプを管理するには
[セキュリティ] > [Web App Firewall] に移動し、 [設定] セクションで [JSON コンテンツタイプの管理] を選択します。
Web App Firewall の JSON コンテンツタイプの設定パネルで 、アプリケーションのニーズに合わせて JSON コンテンツタイプを追加、編集、または削除します。
JSON ペイロード内の攻撃を検出するための署名保護の設定
有効な JSON コンテンツタイプに加えて、JSON リクエストで検出されたときにセキュリティ違反であることを示すパターンを指定する署名を設定する必要があります。ブロックやログなどの指定されたアクションは、受信リクエストによってシグニチャルール内のすべてのターゲットパターンが一致したときに実行されます。
カスタマイズされた署名ルールを追加するには、CitrixではGUIを使用することをお勧めします。[ システム ] > [ セキュリティ ] > [ Web App Firewall ] > [ 署名] に移動します。ターゲットシグニチャオブジェクトをダブルクリックして、 [Web App Firewall Signatures] パネルにアクセスします。[ 追加 ] ボタンをクリックして、アクション、カテゴリ、ログ文字列、ルールパターンなどを設定します。Web App Firewall は、許可されているすべてのコンテンツタイプのペイロードの署名一致を検査しますが、ルールに JSON 式を指定することで処理を最適化できます。 新しいルールパターンを追加するときは 、 Match のドロップダウンオプションで Expression を選択し、JSON ペイロードからターゲットマッチ式を入力して、検査が必要な特定のリクエストを特定します。式は TEXT で始まる必要があります。 プレフィックス。他のルールパターンを追加して、攻撃を特定するための追加のマッチパターンを指定できます。
次の例は、署名ルールを示しています。JSON ペイロードの POST 本文で、指定した XPATH_JSON 式と一致するクロスサイトスクリプトタグが検出されると、シグネチャマッチがトリガーされます。
JSON ペイロードのクロスサイトスクリプティングを検出する署名の例
<SignatureRule actions="log,stats" category="JSON" enabled="ON" id="1000001" severity="" source="" type="" version="1">
<PatternList>
<RequestPatterns>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="Expression">TEXT.XPATH_JSON(xp%/glossary/title%).CONTAINS("example glossary")</Match>
</Pattern>
<Pattern>
<Location area="HTTP_METHOD"/>
<Match type="LITERAL">POST</Match>
</Pattern>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="CrossSiteScripting"/>
</Pattern>
</RequestPatterns>
</PatternList>
<LogString>Cross-site scripting violation detected in json payload</LogString>
<Comment/>
</SignatureRule>
<!--NeedCopy-->
ペイロードの例
次のペイロードは、クロスサイトスクリプティングタグ <Gotcha!!> が含まれているため、シグニチャの一致をトリガーします。 を選択します。
{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages \*\*<Gotcha!!>\*\* such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}
<!--NeedCopy-->
ログメッセージの例
Aug 21 12:21:42 <local0.info> 10.217.31.239 08/21/2015:23:21:42 GMT ns 0-PPE-1 : APPFW APPFW_SIGNATURE_MATCH 1471 0 : 10.217.253.62 990-PPE0 NtJnVMNnvPeQJnaUzXYW/GTvAQsA010 prof1 http://10.217.31.212/FFC/login_post.php Signature violation rule ID 1000001: cross-site scripting violation detected in json payload <not blocked>
<!--NeedCopy-->
注
クロスサイトスクリプトタグ(<Gotcha!! >)、シグネチャルールの一致はトリガーされません。
ハイライト
- JSON ペイロードを保護するには、Web App Firewall シグネチャを使用してクロスサイトスクリプティング、SQL、その他の違反を検出します。
- JSON コンテンツタイプがアプライアンスで許可されているコンテンツタイプとして設定されていることを確認します。
- ペイロードのコンテンツタイプが、設定された JSON コンテンツタイプと一致していることを確認してください。
- シグニチャ違反が発生するには、シグニチャルールで設定されたすべてのパターンが一致していることを確認してください。
- シグニチャルールを追加する場合、JSON ペイロードの Expression と一致するルールパターンが少なくとも 1 つ必要です。シグニチャルールの PI 式はすべて、プレフィックス TEXT. で始まり、ブール値でなければなりません。
ポリシーとシグネチャを使用して、アプリケーションまたは JSON コンテンツタイプを SQL とクロスサイトスクリプティングでエンコードされたペイロードで保護します
NetScaler Web App Firewallは、ポリシーと署名を使用してアプリケーションまたはJSONコンテンツタイプを保護できます。
ポリシーを使用してアプリケーションまたは JSON コンテンツタイプの SQL インジェクションを検査する
SQL インジェクションをサポートするために、次のポリシーを追加し、仮想サーバーにグローバルにバインドする必要があります。
add appfw policy sqli_1 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#(((\\A)|(?<=[^a-zA-Z0-9_])))(select|insert|delete|update|drop|create|alter|grant|revoke|commit|rollback|shutdown|union|intersect|minus|case|decode|where|group|begin|join|exists|distinct|add|modify|constraint|null|like|exec|execute|char|or|and|sp_sdidebug)((Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK
add appfw policy sqli_2 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\\A)|(?<=[^a-zA-Z0-9_]))(xp_availablemedia|xp_cmdshell|xp_deletemail|xp_dirtree|xp_dropwebtask|xp_dsninfo|xp_enumdsn|xp_enumerrorlogs|xp_enumgroups|xp_enumqueuedtasks|xp_eventlog|xp_findnextmsg|xp_fixeddrives|xp_getfiledetails|xp_getnetname|xp_grantlogin|xp_logevent|xp_loginconfig|xp_logininfo|xp_makewebtask|xp_msver|xp_regread|xp_perfend|xp_perfmonitor|xp_perfsample|xp_perfstart|xp_readerrorlog|xp_readmail|xp_revokelogin|xp_runwebtask|xp_schedulersignal|xp_sendmail|xp_servicecontrol|xp_snmp_getstate|xp_snmp_raisetrap|xp_sprintf|xp_sqlinventory|xp_sqlregister|xp_sqltrace|xp_sscanf|xp_startmail|xp_stopmail|xp_subdirs|xp_unc_to_drive)((Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK
add appfw policy sqli_3 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\\A)|(?<=[^a-zA-Z0-9_]))(sysobjects|syscolumns|MSysACEs|MSysObjects|MSysQueries|MSysRelationships)((Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK
add appfw policy sqli_4 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\\A)|(?<=[^a-zA-Z0-9_]))(SYS\.USER_OBJECTS|SYS\.TAB|SYS\.USER_TABLES|SYS\.USER_VIEWS|SYS\.ALL_TABLES|SYS\.USER_TAB_COLUMNS|SYS\.USER_CONSTRAINTS|SYS\.USER_TRIGGERS|SYS\.USER_CATALOG|SYS\.ALL_CATALOG|SYS\.ALL_CONSTRAINTS|SYS\.ALL_OBJECTS|SYS\.ALL_TAB_COLUMNS|SYS\.ALL_TAB_PRIVS|SYS\.ALL_TRIGGERS|SYS\.ALL_USERS|SYS\.ALL_VIEWS|SYS\.USER_ROLE_PRIVS|SYS\.USER_SYS_PRIVS|SYS\.USER_TAB_PRIVS)((Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK
署名を使用してアプリケーションまたは JSON コンテンツタイプを検査する
JSON content-type の SQL インジェクションをサポートするために、アプリケーションファイアウォールプロファイルの署名オブジェクトに次の署名ルールを追加できます。
注:
ポストボディシグネチャは CPU を大量に消費します。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2013-2018 Citrix Systems, Inc. All rights reserved. -->
<SignaturesFile schema_version="6" version="0" minor_schema_version="0">
<Signatures>
<SignatureRule id="4000000" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
<PatternList>
<RequestPatterns>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#(((\A)|(?<=[^a-zA-Z0-9_])))(select|insert|delete|update|drop|create|alter|grant|revoke|commit|rollback|shutdown|union|intersect|minus|case|decode|where|group|begin|join|exists|distinct|add|modify|constraint|null|like|exec|execute|char|or|and|sp_sdidebug)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
</Pattern>
<Pattern type="fastmatch">
<Location area="HTTP_METHOD"/>
<Match type="LITERAL">T</Match>
</Pattern>
</RequestPatterns>
</PatternList>
<LogString>sql Injection</LogString>
<Comment/>
</SignatureRule>
<SignatureRule id="4000001" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
<PatternList>
<RequestPatterns>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(xp_availablemedia|xp_cmdshell|xp_deletemail|xp_dirtree|xp_dropwebtask|xp_dsninfo|xp_enumdsn|xp_enumerrorlogs|xp_enumgroups|xp_enumqueuedtasks|xp_eventlog|xp_findnextmsg|xp_fixeddrives|xp_getfiledetails|xp_getnetname|xp_grantlogin|xp_logevent|xp_loginconfig|xp_logininfo|xp_makewebtask|xp_msver|xp_regread|xp_perfend|xp_perfmonitor|xp_perfsample|xp_perfstart|xp_readerrorlog|xp_readmail|xp_revokelogin|xp_runwebtask|xp_schedulersignal|xp_sendmail|xp_servicecontrol|xp_snmp_getstate|xp_snmp_raisetrap|xp_sprintf|xp_sqlinventory|xp_sqlregister|xp_sqltrace|xp_sscanf|xp_startmail|xp_stopmail|xp_subdirs|xp_unc_to_drive)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
</Pattern>
<Pattern type="fastmatch">
<Location area="HTTP_METHOD"/>
<Match type="LITERAL">T</Match>
</Pattern>
</RequestPatterns>
</PatternList>
<LogString>sql Injection</LogString>
<Comment/>
</SignatureRule>
<SignatureRule id="4000002" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
<PatternList>
<RequestPatterns>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(sysobjects|syscolumns|MSysACEs|MSysObjects|MSysQueries|MSysRelationships)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
</Pattern>
<Pattern type="fastmatch">
<Location area="HTTP_METHOD"/>
<Match type="LITERAL">T</Match>
</Pattern>
</RequestPatterns>
</PatternList>
<LogString>sql Injection</LogString>
<Comment/>
</SignatureRule>
<SignatureRule id="4000003" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
<PatternList>
<RequestPatterns>
<Pattern>
<Location area="HTTP_POST_BODY"/>
<Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(SYS.USER_OBJECTS|SYS.TAB|SYS.USER_TABLES|SYS.USER_VIEWS|SYS.ALL_TABLES|SYS.USER_TAB_COLUMNS|SYS.USER_CONSTRAINTS|SYS.USER_TRIGGERS|SYS.USER_CATALOG|SYS.ALL_CATALOG|SYS.ALL_CONSTRAINTS|SYS.ALL_OBJECTS|SYS.ALL_TAB_COLUMNS|SYS.ALL_TAB_PRIVS|SYS.ALL_TRIGGERS|SYS.ALL_USERS|SYS.ALL_VIEWS|SYS.USER_ROLE_PRIVS|SYS.USER_SYS_PRIVS|SYS.USER_TAB_PRIVS)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
</Pattern>
<Pattern type="fastmatch">
<Location area="HTTP_METHOD"/>
<Match type="LITERAL">T</Match>
</Pattern>
</RequestPatterns>
</PatternList>
<LogString>sql Injection</LogString>
<Comment/>
</SignatureRule>
</Signatures>
</SignaturesFile>
<!--NeedCopy-->