Protección de aplicaciones JSON mediante firmas

JavaScript Object Notation (JSON) es un estándar abierto basado en texto derivado del lenguaje de scripts JavaScript. JSON es preferido para la representación legible por humanos de estructuras de datos simples y matrices asociativas, llamadas objetos. Sirve como una alternativa a XML y se utiliza principalmente para transmitir estructuras de datos serializados para comunicarse con aplicaciones web. Los archivos JSON normalmente se guardan con una extensión.json.

La carga JSON normalmente se envía con el tipo MIME especificado como application/json. Los otros tipos de contenido “estándar” para JSON son:

  • aplicación/x-javaScript
  • texto/javaScript
  • texto/x-javaScript
  • texto/x-json

Uso de las firmas de Citrix Web App Firewall para proteger las aplicaciones JSON

Para permitir solicitudes JSON, el dispositivo está preconfigurado con el tipo de contenido JSON como se muestra en el siguiente resultado de show-command:

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

Citrix Web App Firewall procesa el cuerpo de publicación solo para los siguientes tipos de contenido:

  • application/x-www-form-urlencoded
  • multipart/form-datos
  • texto/x-gwt-rpc

Las solicitudes que se reciben con otros encabezados de tipo de contenido incluyendo application/json (o cualquier otro tipo de contenido permitido) se reenvían al back-end después de la inspección de encabezado. El cuerpo de la publicación en dichas solicitudes no se inspecciona para detectar infracciones de comprobación de seguridad incluso cuando las comprobaciones de seguridad del perfil como SQL o XSS están habilitadas.

Con el fin de proteger las aplicaciones JSON y detectar infracciones, se pueden usar firmas de Web App Firewall. Todas las solicitudes que contienen el encabezado de tipo de contenido permitido son procesadas por Web App Firewall para la coincidencia de firmas. Puede agregar sus propias reglas de firma personalizadas para procesar la carga JSON y realizar varias inspecciones de comprobación de seguridad (por ejemplo, XSS, SQL y Coherencia de campos), para detectar infracciones en los encabezados y en el cuerpo de la publicación, y realizar acciones específicas.

Sugerencia

A diferencia de los otros valores predeterminados incorporados, el tipo de contenido JSON preconfigurado se puede modificar o eliminar mediante la CLI o la GUI (GUI). Si las solicitudes legítimas para aplicaciones JSON se bloquean y desencadenan violaciones de tipo de contenido, compruebe que el valor del tipo de contenido está configurado con precisión. Para obtener más información sobre cómo Web App Firewall procesa el encabezado de tipo de contenido, consulte Protección del tipo de contenido

Para agregar o quitar el tipo de contenido JSON mediante la interfaz de línea de comandos

En el símbolo del sistema, escriba uno de los siguientes comandos:

add appfw jsonContentType ^application/json$ IsRegEx REGEX

rm appfw JSONContentType "^application/json$"

Para administrar tipos de contenido JSON mediante la interfaz gráfica de usuario

Vaya a Seguridad > Web App Firewall y, en la sección Configuración, seleccione Administrar tipos de contenido JSON.

En el panel Configurar Web App Firewall JSON Content Type, agregue, modifique o elimine tipos de contenido JSON para que se adapten a las necesidades de sus aplicaciones.

Configurar la protección de firmas para detectar ataques en la carga JSON

Además de un tipo de contenido JSON válido, debe configurar firmas para especificar los patrones que, cuando se detectan en una solicitud JSON, indican una infracción de seguridad. Las acciones especificadas, como bloque y registro, se realizan cuando una solicitud entrante activa una coincidencia para todos los patrones de destino en la regla de firma.

Para agregar una regla de firma personalizada, Citrix recomienda utilizar la GUI. Vaya a Sistema > Seguridad > Web App Firewall > Firmas. Haga doble clic en el objeto de firma de destino para acceder al panel Modificar firmas de Web App Firewall. Haga clic en el botón Agregar para configurar las acciones, la categoría, la cadena de registro, los patrones de reglas, etc. Aunque Web App Firewall inspecciona toda la carga útil de tipo de contenido permitida para que coincida con la firma, puede optimizar el procesamiento especificando la expresión JSON en la regla. Cuando agregue un nuevo patrón de regla, seleccione Expresión en las opciones desplegables de Coincidencia y proporcione la expresión de coincidencia de destino de su carga útil JSON para identificar las solicitudes específicas que deben inspeccionarse. Una expresión debe comenzar con un prefijo TEXTO. Puede agregar otros patrones de regla para especificar patrones de coincidencia adicionales para identificar el ataque.

En el ejemplo siguiente se muestra una regla de firma. Si se detecta cualquier etiqueta de script entre sitios en el cuerpo POST de la carga JSON que coincida con la expresión XPATH_JSON especificada, se activa una coincidencia de firma.

Ejemplo de una firma para detectar XSS en la carga 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>

Ejemplo de la carga útil

La siguiente carga activa la coincidencia de firma, ya que incluye la etiqueta de script entre sitios <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"}}}}}

Ejemplo del mensaje de registro

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>

Nota

Si envía la misma carga después de eliminar la etiqueta de script entre sitios (<Gotcha!!>), la coincidencia de regla de firma no se activa.

Resumen

  • Para proteger la carga JSON, use las firmas de Web App Firewall para detectar XSS, SQL y otras infracciones.
  • Compruebe que el tipo de contenido JSON esté configurado en el dispositivo como el tipo de contenido permitido.
  • Asegúrese de que el tipo de contenido de la carga útil coincida con el tipo de contenido JSON configurado.
  • Asegúrese de que todos los patrones configurados en la regla de firma coinciden con la infracción de firma que se va a desencadenar.
  • Cuando agrega una regla de firma, DEBE tener al menos un patrón de regla para que coincida con la expresión en la carga útil JSON. Todas las expresiones PI de las reglas de firma deben comenzar con el prefijo TEXTO. y deben ser booleanas.

Proteja la aplicación o el tipo de contenido JSON con carga útil codificada SQL y XSS mediante directivas y firmas

Citrix Web App Firewall puede proteger el tipo de contenido JSON o aplicación mediante directivas y firmas.

Inspeccionar el tipo de contenido JSON o aplicación para la inyección SQL mediante directivas

Debe agregar las siguientes directivas y vincularlo al servidor virtual globalmente para admitir la inyección 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`

Inspeccionar el tipo de contenido JSON o aplicación mediante firmas

Puede agregar las siguientes reglas de firma al objeto de firma en el perfil de firewall de la aplicación para admitir la inyección SQL para el tipo de contenido JSON.

Nota:

Las firmas de los cuerpos de las publicaciones requieren un uso intensivo de la 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>