ADC

Schutz von JSON-Anwendungen mithilfe von Signaturen

JavaScript Object Notation (JSON) ist ein textbasierter offener Standard, der von der Skriptsprache JavaScript abgeleitet ist. JSON wird für die menschenlesbare Darstellung einfacher Datenstrukturen und assoziativer Arrays, sogenannter Objekte, bevorzugt. 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-Payload wird normalerweise mit dem als application/jsonangegebenen MIME-Typ gesendet. Die anderen „Standard“ -Inhaltstypen für JSON sind:

  • Anwendung/X-Javascript
  • Text/Javascript
  • text/x-javascript
  • text/x-json

Verwendung der NetScaler Web App Firewall-Signaturen zum Schutz von JSON-Anwendungen

Um JSON-Anfragen 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
<!--NeedCopy-->

Die NetScaler Web App Firewall verarbeitet den Beitragstext nur für die folgenden Inhaltstypen:

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

Die Anfragen, die mit anderen Content-Type-Headern, einschließlich application/json (oder einem anderen zulässigen Inhaltstyp), eingehen, werden nach der Header-Prüfung an das Backend weitergeleitet. Der Posttext solcher Anfragen wird nicht auf Verstöße gegen die Sicherheitsüberprüfung überprüft, selbst wenn die Sicherheitsprüfungen des Profils wie SQL oder Cross-Site Scripting aktiviert sind.

Um JSON-Anwendungen zu schützen und Verstöße zu erkennen, können Web App Firewall-Signaturen verwendet werden. Alle Anfragen, die den erlaubten Content-Type-Header enthalten, werden von der Web App Firewall auf Signaturabgleich verarbeitet. Sie können Ihre eigenen benutzerdefinierten Signaturregeln zur Verarbeitung von JSON-Payloads hinzufügen, um verschiedene Sicherheitsprüfungen durchzuführen (z. B. Cross-Site Scripting, SQL und Field Consistency), um Verstöße in den Headern sowie im Beitragstext zu erkennen und bestimmte Maßnahmen zu ergreifen.

Tipp

Im Gegensatz zu den anderen integrierten Standardeinstellungen kann der vorkonfigurierte JSON-Inhaltstyp mithilfe 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 darüber, wie Web App Firewall Content-Typ-Header verarbeitet, finden Sie unter Schutz von Inhaltstypen

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 mithilfe der GUI

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

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.

Konfiguration des Signaturschutzes zur Erkennung von Angriffen in JSON-Payload

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

Um eine benutzerdefinierte Signaturregel hinzuzufügen, empfiehlt Citrix, die GUI zu verwenden. 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 die Aktionen, die Kategorie, die Protokollzeichenfolge, die Regelmuster usw. zu konfigurieren. Die Web App Firewall überprüft zwar alle zulässigen Nutzdaten vom Inhaltstyp auf Signaturübereinstimmungen, Sie können die Verarbeitung jedoch optimieren, indem Sie den JSON-Ausdruck in der Regel angeben. Wenn Sie ein neues Regelmuster hinzufügen, wählen Sie in den Drop-down-Optionen für Match die Option Ausdruck aus und geben Sie den Ziel-Match-Ausdruck aus Ihrer JSON-Payload an, um die spezifischen Anfragen zu identifizieren, die überprüft werden müssen. Ein Ausdruck muss mit einem TEXT beginnen. Präfix. Sie können weitere Regelmuster hinzufügen, um zusätzliche Übereinstimmungsmuster zur Identifizierung des Angriffs festzulegen.

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

Beispiel für eine Signatur zur Erkennung von Cross-Site Scripting in JSON-Payload

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

Beispiel für die Payload

Die folgende Payload löst den Signatur-Match aus, da sie das Cross-Site-Scripting-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"}}}}}
<!--NeedCopy-->

Beispiel für die Lognachricht

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

Hinweis

Wenn du dieselbe Payload sendest, nachdem du das Cross-Site-Script-Tag entfernt hast (<Gotcha!!>), der Signaturregelabgleich wird nicht ausgelöst.

Highlights

  • Verwenden Sie Web App Firewall-Signaturen, um Cross-Site Scripting, SQL und andere Verstöße zu erkennen, um JSON-Payload zu schützen.
  • Stellen Sie sicher, dass der JSON-Inhaltstyp auf der Appliance als zulässiger Inhaltstyp konfiguriert ist.
  • Stellen Sie sicher, dass der Inhaltstyp in der Payload dem konfigurierten JSON-Inhaltstyp entspricht.
  • Stellen Sie sicher, dass alle in der Signaturregel konfigurierten Muster übereinstimmen, damit die ausgelöste Signaturverletzung ausgelöst wird.
  • Wenn Sie eine Signaturregel hinzufügen, MUSS sie mindestens ein Regelmuster haben, das dem Ausdruck in der JSON-Payload entspricht. Alle PI-Ausdrücke in Signaturregeln müssen mit dem Präfix TEXT. beginnen und vom Typ Boolean sein.

Schützen Sie Anwendungs- oder JSON-Inhaltstypen mit SQL- und Cross-Site-Scripting-kodierten Payloads mithilfe von Richtlinien und Signaturen

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

Überprüfen Sie den Anwendungs- oder JSON-Inhaltstyp 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|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

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

Sie können dem Signaturobjekt im Anwendungsfirewallprofil die folgenden Signaturregeln hinzufügen, um die SQL-Injektion für den JSON-Inhaltstyp zu unterstützen.

Hinweis:

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

<!--NeedCopy-->