署名を使用した 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
Citrix Web App Firewall 署名を使用したJSONアプリケーションの保護
JSON リクエストを許可するために、アプライアンスは JSON コンテンツタイプで事前設定されています。以下の show-command 出力を参照してください。
> sh appfw jsonContentType
1) JSONContenttypevalue: "^application/json$" IsRegex: REGEX
Done
<!--NeedCopy-->
Citrix Web App Firewall は、次のコンテンツタイプについてのみポスト本文を処理します。
- application/x-www-form-urlencoded
- multipart/form-data
- text/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 リクエストで検出された場合にセキュリティ違反を示すパターンを指定するように署名を設定する必要があります。指定されたアクション(block や log など)は、着信要求がシグニチャルールのすべてのターゲットパターンに対して一致をトリガーしたときに実行されます。
カスタマイズしたシグネチャルールを追加するには、GUIを使用することをお勧めします。[システム] > [セキュリティ] > [Web App Firewall] > [署名] に移動します。ターゲットシグニチャオブジェクトをダブルクリックして、 [Web App Firewall Signatures] パネルにアクセスします。[追加] ボタンをクリックして、アクション、カテゴリ、ログ文字列、規則パターンなどを設定します。Web App Firewall は、許可されたすべてのコンテンツタイプペイロードで署名の一致を検査しますが、ルールで JSON 式を指定することで処理を最適化できます。新しいルールパターン を追加 する場合は、[Match] のドロップダウンオプションで [Expression] を選択し、JSON ペイロードからターゲットの一致式を指定して、検査が必要な特定のリクエストを特定します。式は TEXT で始まる必要があります。 プレフィックス。他のルールパターンを追加して、攻撃を識別するための追加のマッチパターンを指定できます。
次の例は、シグニチャルールを示しています。指定した XPATH_JSON 式に一致するクロスサイトスクリプトタグが JSON ペイロードのPOST本文で検出されると、シグニチャの一致がトリガーされます。
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 ペイロードの式と一致するルールパターンが少なくとも 1 つ必要です。シグニチャルール内のすべての PI 式は、プレフィクス TEXT. で始まり、ブールである必要があります。
ポリシーと署名を使用して、SQLおよびクロスサイトスクリプティングでエンコードされたペイロードでアプリケーションまたはJSONコンテンツタイプを保護します
Citrix 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-->