ADC

Protection des applications JSON à l’aide de signatures

JavaScript Object Notation (JSON) est un standard ouvert basé sur du texte dérivé du langage de script JavaScript. Le format JSON est préférable pour la représentation lisible par l’homme de structures de données simples et de tableaux associatifs, appelés objets. Il constitue une alternative au XML et est principalement utilisé pour transmettre des structures de données sérialisées pour communiquer avec des applications Web. Les fichiers JSON sont généralement enregistrés avec une extension .json.

La charge utile JSON est généralement envoyée avec le type MIME spécifié comme application/json. Les autres types de contenu « standard » pour JSON sont les suivants :

  • application/x-javascript
  • texte/javascript
  • texte/x-javascript
  • text/x-json

Utilisation des signatures du NetScaler Web App Firewall pour protéger les applications JSON

Pour autoriser les requêtes JSON, l’appliance est préconfigurée avec le type de contenu JSON, comme indiqué dans la sortie show-command suivante :

> sh appfw jsonContentType
1)      JSONContenttypevalue:  "^application/json$" IsRegex:  REGEX
Done
<!--NeedCopy-->

Le pare-feu NetScaler Web App traite le corps du message uniquement pour les types de contenu suivants :

  • application/x-www-form-urlencoded
  • multipart/form-data
  • texte/x-gwt-rpc

Les demandes reçues avec d’autres en-têtes de type de contenu, y compris application/json (ou tout autre type de contenu autorisé) sont transmises au backend après inspection des en-têtes. Le corps de publication de ces requêtes n’est pas inspecté pour détecter toute violation des contrôles de sécurité, même lorsque les contrôles de sécurité du profil, tels que le SQL ou les scripts intersites, sont activés.

Afin de protéger les applications JSON et de détecter les violations, les signatures du Web App Firewall peuvent être utilisées. Toutes les demandes contenant l’en-tête du type de contenu autorisé sont traitées par le Web App Firewall pour la correspondance des signatures. Vous pouvez ajouter vos propres règles de signature personnalisées pour traiter la charge utile JSON afin d’effectuer diverses inspections de sécurité (par exemple, des scripts intersites, du SQL et de la cohérence des champs), de détecter les violations dans les en-têtes ainsi que dans le corps du message, et de prendre des mesures spécifiques.

Conseil

Contrairement aux autres valeurs par défaut intégrées, le type de contenu JSON préconfiguré peut être modifié ou supprimé à l’aide de l’interface de ligne de commande ou de l’interface graphique (GUI). Si des requêtes légitimes pour des applications JSON sont bloquées et déclenchent des violations de type de contenu, vérifiez que la valeur du type de contenu est configurée avec précision. Pour plus d’informations sur la façon dont Web App Firewall traite l’en-tête de type de contenu, voir Protection du type de contenu.

Pour ajouter ou supprimer le type de contenu JSON à l’aide de l’interface de ligne de commande

À l’invite de commandes, tapez l’une des commandes suivantes :

add appfw jsonContentType ^application/json$ IsRegEx REGEX

rm appfw JSONContentType "^application/json$"

Pour gérer les types de contenu JSON à l’aide de l’interface graphique

Accédez à Sécurité > Web App Firewall et, dans la section Paramètres, sélectionnez Gérer les types de contenu JSON.

Dans le panneau Configurer le type de contenu JSON du Web App Firewall, ajoutez, modifiez ou supprimez des types de contenu JSON pour répondre aux besoins de vos applications.

Configuration de la protection des signatures pour détecter les attaques dans la charge utile JSON

Outre un type de contenu JSON valide, vous devez configurer des signatures pour spécifier le ou les modèles qui, lorsqu’ils sont détectés dans une requête JSON, indiquent une faille de sécurité. Les actions spécifiées, telles que le blocage et l’enregistrement, sont effectuées lorsqu’une demande entrante déclenche une correspondance pour tous les modèles cibles de la règle de signature.

Pour ajouter une règle de signature personnalisée, Citrix vous recommande d’utiliser l’interface graphique. Accédez à Système > Sécurité > Web App Firewall > Signatures. Double-cliquez sur l’objet de signature cible pour accéder au panneau Modifier les signatures du Web App Firewall . Cliquez sur le bouton Ajouter pour configurer les actions, la catégorie, la chaîne de journal, les modèles de règles, etc. Bien que le Web App Firewall inspecte toutes les charges utiles de type de contenu autorisées pour détecter la correspondance des signatures, vous pouvez optimiser le traitement en spécifiant l’expression JSON dans la règle. Lorsque vous ajoutez un nouveau modèle de règle, sélectionnez Expression dans les options déroulantes de Match et indiquez l’expression de correspondance cible à partir de votre charge utile JSON pour identifier les demandes spécifiques qui doivent être inspectées. Une expression doit commencer par un TEXT. préfixe. Vous pouvez ajouter d’autres modèles de règles pour spécifier des modèles de correspondance supplémentaires afin d’identifier l’attaque.

L’exemple suivant montre une règle de signature. Si une balise de script intersite est détectée dans le corps POST de la charge utile JSON qui correspond à l’expression XPATH_JSON spécifiée, une correspondance de signature est déclenchée.

Exemple de signature pour détecter les scripts intersites dans la charge utile 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-->

Exemple de charge utile

La charge utile suivante déclenche la correspondance de signature, car elle inclut la balise de script cross-site <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-->

Exemple de message de journal

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-->

Remarque

Si vous envoyez la même charge utile après avoir supprimé la balise de script inter-site (<Gotcha!!>), la correspondance de règle de signature n’est pas déclenchée.

Résumé

  • Pour protéger la charge utile JSON, utilisez les signatures du Web App Firewall pour détecter les violations liées aux scripts intersites, au SQL et à d’autres violations.
  • Vérifiez que le type de contenu JSON est configuré sur l’appliance en tant que type de contenu autorisé.
  • Assurez-vous que le type de contenu de la charge utile correspond au type de contenu JSON configuré.
  • Assurez-vous que tous les modèles configurés dans la règle de signature correspondent pour que la violation de signature soit déclenchée.
  • Lorsque vous ajoutez une règle de signature, elle DOIT comporter au moins un modèle de règle correspondant à l’expression de la charge utile JSON. Toutes les expressions PI figurant dans les règles de signature doivent commencer par le préfixe TEXT et doivent être booléennes.

Protégez l’application ou le type de contenu JSON avec SQL et la charge utile codée par script inter-site à l’aide de stratégies et de signatures

NetScaler Web App Firewall peut protéger les applications ou les types de contenu JSON à l’aide de stratégies et de signatures.

Inspecter l’application ou le type de contenu JSON pour une injection SQL à l’aide de stratégies

Vous devez ajouter les stratégies suivantes et les lier au serveur virtuel globalement pour prendre en charge l’injection 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

Inspecter l’application ou le type de contenu JSON à l’aide de signatures

Vous pouvez ajouter les règles de signature suivantes à l’objet de signature dans le profil du pare-feu de l’application afin de prendre en charge l’injection SQL pour le type de contenu JSON.

Remarque :

Les signatures postérieures sont gourmandes en 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-->