Schützen von JSON-Anwendungen mit Signaturen

JavaScript Object Notation (JSON) ist ein textbasierter offener Standard, der von der JavaScript-Skriptsprache abgeleitet wird. JSON wird bevorzugt für die von Menschen lesbare Darstellung einfacher Datenstrukturen und assoziativer Arrays, sogenannte Objekte. Es dient als Alternative zu XML und wird hauptsächlich zur Übertragung serialisierter Datenstrukturen für die Kommunikation mit Webanwendungen verwendet. Die JSON-Dateien werden normalerweise mit der Erweiterung .json gespeichert.

Die JSON-Nutzlast wird normalerweise mit dem MIME-Typ gesendet, der als application/jsonangegeben ist. Die anderen Standard Inhaltstypen für JSON sind:

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

Verwenden der Citrix Web App Firewall -Signaturen zum Schutz von JSON-Anwendungen

Um JSON-Anforderungen zuzulassen, ist die Appliance mit dem JSON-Inhaltstyp vorkonfiguriert, wie in der folgenden Show-Command-Ausgabe dargestellt:

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

Die Citrix Web App Firewall verarbeitet den Posttext nur für die folgenden Inhaltstypen:

  • application/x-www-form-urlencoded
  • Mehrteil-/Formulardaten
  • text/x-gwt-rpc

Die Anforderungen, die mit anderen Content-Type-Headern einschließlich application/json (oder einem anderen zulässigen Inhaltstyp) empfangen werden, werden nach der Header-Prüfung an das Backend weitergeleitet. Der Postbody in solchen Anforderungen wird nicht auf Sicherheitsüberprüfungen überprüft, selbst wenn die Sicherheitsüberprüfungen des Profils wie SQL oder XSS aktiviert sind.

Um JSON-Anwendungen zu schützen und Verletzungen zu erkennen, können Web App Firewall -Signaturen verwendet werden. Alle Anforderungen, die den zulässigen Content-Type-Header enthalten, werden von der Web App Firewall für die Signaturübereinstimmung verarbeitet. Sie können eigene benutzerdefinierte Signaturregeln hinzufügen, um JSON-Nutzlast zu verarbeiten, um verschiedene Sicherheitsprüfungen (z. B. XSS, SQL und Field Consistency) durchzuführen, Verletzungen in den Headern sowie im Posttext zu erkennen und bestimmte Aktionen durchzuführen.

Tipp

Im Gegensatz zu den anderen integrierten Standardeinstellungen kann der vorkonfigurierte JSON-Inhaltstyp mit der CLI oder der GUI (GUI) bearbeitet oder entfernt werden. Wenn legitime Anforderungen für JSON-Anwendungen blockiert werden und Inhaltstypverletzungen auslösen, überprüfen Sie, ob der Inhaltstypwert genau konfiguriert ist. Weitere Informationen dazu, wie Web App Firewall Content-Type-Header verarbeitet, finden Sie unterSchutz des Inhaltstyps

So fügen Sie JSON-Inhaltstyp mit der Befehlszeilenschnittstelle hinzu oder entfernen Sie sie

Geben Sie an der Eingabeaufforderung einen der folgenden Befehle ein:

add appfw jsonContentType ^application/json$ IsRegEx REGEX

rm appfw JSONContentType "^application/json$"

So verwalten Sie JSON-Inhaltstypen mit der GUI

Navigieren Sie zu Sicherheit > Web App Firewall, und wählen Sie im Abschnitt Einstellungen die Option JSON-Inhaltstypen verwalten aus.

Fügen Sie im Fenster JSONWeb App Firewall Inhaltstyp konfigurieren JSON-Inhaltstypen hinzu, bearbeiten oder löschen Sie JSON-Inhaltstypen entsprechend den Anforderungen Ihrer Anwendungen.

Konfigurieren des Signaturschutzes zur Erkennung von Angriffen in JSON-Nutzlast

Zusätzlich zu einem gültigen JSON-Inhaltstyp müssen Sie Signaturen konfigurieren, um die Muster anzugeben, die, wenn sie in einer JSON-Anforderung erkannt werden, auf eine Sicherheitsverletzung hinweisen. Die angegebenen Aktionen, wie Block und Protokoll, werden ausgeführt, wenn eine eingehende Anforderung eine Übereinstimmung für alle Zielmuster in der Signaturregel auslöst.

Um eine benutzerdefinierte Signaturregel hinzuzufügen, empfiehlt Citrix die Verwendung der GUI. Navigieren Sie zu System > Sicherheit > Web App Firewall > Signaturen . Doppelklicken Sie auf das Zielsignaturobjekt, um auf das Bedienfeld Web App Firewall -Signaturen bearbeiten zuzugreifen. Klicken Sie auf die Schaltfläche Hinzufügen, um Aktionen, Kategorie, Protokollzeichenfolge, Regelmuster usw. zu konfigurieren. Obwohl die Web App Firewall alle zulässigen Inhaltstype-Nutzlast auf Signaturübereinstimmung überprüft, können Sie die Verarbeitung optimieren, indem Sie den JSON-Ausdruck in der Regel angeben. Wenn Sie ein neues Regelmuster hinzufügen, wählen Sie in den Dropdown-Optionen für Übereinstimmung die Option Ausdruck aus, und geben Sie den Zielübereinstimmungsausdruck aus Ihrer JSON-Nutzlast an, um die spezifischen Anforderungen zu identifizieren, die überprüft werden müssen. Ein Ausdruck muss mit einem TEXT. -Präfix beginnen. Sie können andere Regelmuster hinzufügen, um zusätzliche Übereinstimmungsmuster zur Identifizierung des Angriffs anzugeben.

Das folgende Beispiel zeigt eine Signaturregel. Wenn im POST-Text der JSON-Nutzlast ein siteübergreifendes Skript-Tag erkannt wird, das dem angegebenen XPATH_JSON-Ausdruck entspricht, wird eine Signaturübereinstimmung ausgelöst.

Beispiel für eine Signatur zum Erkennen von XSS in JSON-Nutzlast

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

Beispiel für die Nutzlast

Die folgende Nutzlast löst die Signaturübereinstimmung aus, da sie das siteübergreifende Skript-Tag <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"}}}}}

Beispiel für die Protokollnachricht

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>

Hinweis:

Wenn Sie dieselbe Nutzlast senden, nachdem Sie das Cross-Site-Script-Tag entfernt haben (<Gotcha!!>), wird die Signaturregelübereinstimmung nicht ausgelöst.

Highlights

  • Um JSON-Nutzlast zu schützen, verwenden Sie Web App Firewall -Signaturen, um XSS-, SQL- und andere Verletzungen zu erkennen.
  • Stellen Sie sicher, dass der JSON-Inhaltstyp auf der Appliance als zulässiger Inhaltstyp konfiguriert ist.
  • Stellen Sie sicher, dass der Inhaltstyp in der Nutzlast mit dem konfigurierten JSON-Inhaltstyp übereinstimmt.
  • Stellen Sie sicher, dass alle in der Signaturregel konfigurierten Muster mit der Signaturverletzung übereinstimmen, die ausgelöst werden soll.
  • Wenn Sie eine Signaturregel hinzufügen, MUSS mindestens ein Regelmuster haben, das dem Ausdruck in der JSON-Nutzlast entspricht. Alle PI-Ausdrücke in Signaturregeln müssen mit dem Präfix TEXT beginnen und müssen boolean sein.

Schützen Sie den Anwendungs- oder JSON-Inhaltstyp mit SQL- und XSS-kodierter Nutzlast mithilfe von Richtlinien und Signaturen

Citrix Web App Firewall kann Anwendungs- oder JSON-Inhaltstyp mithilfe von Richtlinien und Signaturen schützen.

Überprüfen des Anwendungs- oder JSON-Inhaltstyps auf SQL-Injection mithilfe von Richtlinien

Sie müssen die folgenden Richtlinien hinzufügen und sie global an den virtuellen Server binden, um SQL-Injection zu unterstützen.

`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|einfügen|Löschen|Update|Tropfen|Erstellen|abändern|gewähren|widerrufen|begehen|Rollback|Herunterfahren|Vereinigung|überschneiden|Minus|Fall|decodieren|wobei|Gruppe|beginnen|beitreten|existiert|deutlich|add|ändern|Einschränkung|null|wie|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`

Überprüfen des Anwendungs- oder JSON-Inhaltstyps mit Signaturen

Sie können dem Signaturobjekt im Firewallprofil der Anwendung die folgenden Signaturregeln hinzufügen, um SQL-Injection für JSON-Inhaltstyp zu unterstützen.

Hinweis:

Postbody-Signaturen sind CPU-intensiv.

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