Citrix ADC

Protection des applications JSON à l’aide de signatures

JavaScript Object Notation (JSON) est un standard ouvert basé sur le texte dérivé du langage de script JavaScript. JSON est préféré pour la représentation lisible par l’homme de structures de données simples et de tableaux associatifs, appelés objets. Il sert d’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 :

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

Utilisation des signatures du Citrix 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

Le Citrix Web App Firewall traite le corps de publication pour les types de contenu suivants uniquement :

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

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

Afin de protéger les applications JSON et de détecter les violations, les signatures de Web App Firewall peuvent être utilisées. Toutes les demandes qui contiennent l’en-tête de type de contenu autorisé sont traitées par le Web App Firewall pour la correspondance de signature. Vous pouvez ajouter vos propres règles de signature personnalisées pour traiter la charge utile JSON afin d’effectuer diverses inspections de contrôle de sécurité (par exemple, XSS, SQL et Field Cohérence), de détecter les violations dans les en-têtes ainsi que dans le corps de la publication, et d’effectuer des actions spécifiées.

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

En plus d’un type de contenu JSON valide, vous devez configurer les signatures pour spécifier le ou les modèles qui, lorsqu’ils sont détectés dans une requête JSON, indiquent une violation de sécurité. Les actions spécifiées, telles que bloc et journal, sont effectuées lorsqu’une demande entrante déclenche une correspondance pour tous les modèles cibles dans 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 la correspondance de signature, 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 de liste déroulante pour Match et fournissez l’expression de correspondance cible à partir de votre charge utile JSON pour identifier les requêtes 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 inter-site est détectée dans le corps POST de la charge utile JSON correspondant à l’expression XPATH_JSON spécifiée, une correspondance de signature est déclenchée.

Exemple de signature pour détecter XSS 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>

Exemple de la 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"}}}}}

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>

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 XSS, SQL et autres.
  • 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 dans 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 à la violation de signature à déclencher.
  • Lorsque vous ajoutez une règle de signature, elle DOIT avoir au moins un modèle de règle pour correspondre à l’expression dans la charge utile JSON. Toutes les expressions PI dans les règles de signature doivent commencer par le préfixe TEXT. et doivent être booléens.

Protégez le type de contenu d’application ou JSON avec la charge utile codée SQL et XSS à l’aide de stratégies et de signatures

Citrix Web App Firewall peut protéger l’application ou le type 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|où|groupe|begin|join|exists|distinct|ajouter|modify|constraint|null|like|exec|execute|char|ou|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_revokelogine|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 signature dans le profil de pare-feu de l’application pour 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>