ADC

Protección de aplicaciones JSON mediante firmas

La notación de objetos de JavaScript (JSON) es un estándar abierto basado en texto derivado del lenguaje de secuencias de comandos JavaScript. Se prefiere JSON para la representación legible por humanos de estructuras de datos simples y matrices asociativas, denominadas objetos. Sirve como una alternativa al XML y se utiliza principalmente para transmitir estructuras de datos serializadas para comunicarse con aplicaciones web. Los archivos JSON se guardan normalmente con la 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:

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

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

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

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

El NetScaler Web App Firewall procesa el cuerpo de la publicación únicamente para los siguientes tipos de contenido:

  • aplicación/x-www-form-urlencoded
  • multipart/form-data
  • texto/x-gwt-rpc

Las solicitudes que se reciben con otros encabezados de tipo de contenido, incluidos application/json (o cualquier otro tipo de contenido permitido), se reenvían al backend tras inspeccionar el encabezado. El cuerpo de la publicación de estas solicitudes no se inspecciona para detectar infracciones de los controles de seguridad, incluso cuando las comprobaciones de seguridad del perfil, como SQL o las secuencias de comandos entre sitios, están habilitadas.

Para proteger las aplicaciones JSON y detectar infracciones, se pueden utilizar las firmas de Web App Firewall. El Web App Firewall procesa todas las solicitudes que contienen el encabezado de tipo de contenido permitido para comprobar la coincidencia de firmas. Puede añadir sus propias reglas de firma personalizadas para procesar la carga útil de JSON y realizar diversas inspecciones de comprobación de seguridad (por ejemplo, secuencias de comandos entre sitios, SQL y coherencia de campos), detectar infracciones en los encabezados y en el cuerpo de la publicación y tomar las medidas específicas.

Sugerencia

A diferencia de los otros valores predeterminados integrados, el tipo de contenido JSON preconfigurado se puede editar o eliminar mediante la CLI o la GUI (GUI). Si las solicitudes legítimas para aplicaciones JSON se bloquean y desencadenan infracciones 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 de tipos 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 los 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 el tipo de contenido JSON de Web App Firewall, añada, edite o elimine los tipos de contenido JSON para adaptarlos a las necesidades de sus aplicaciones.

Configuración de la protección de firmas para detectar ataques en la carga útil de JSON

Además de un tipo de contenido JSON válido, debe configurar las firmas para especificar los patrones que, cuando se detectan en una solicitud de JSON, indican una violación de seguridad. Las acciones especificadas, como bloquear y registrar, se llevan a cabo cuando una solicitud entrante desencadena una coincidencia para todos los patrones de destino de la regla de firma.

Para añadir 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 Editar 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. Si bien Web App Firewall inspecciona todas las cargas de tipos de contenido permitidas para comprobar si coinciden firmas, puede optimizar el procesamiento especificando la expresión JSON en la regla. Al añadir un nuevo patrón de reglas, seleccione Expresión en las opciones desplegables de Match y proporcione la expresión de coincidencia objetivo de su carga útil de JSON para identificar las solicitudes específicas que deben inspeccionarse. Una expresión debe empezar por un TEXTO. prefijo. Puede añadir otros patrones de reglas para especificar patrones de coincidencia adicionales a fin de identificar el ataque.

El siguiente ejemplo muestra una regla de firma. Si se detecta alguna 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 firmas.

Ejemplo de una firma para detectar secuencias de comandos entre sitios en una 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>
<!--NeedCopy-->

Ejemplo de carga

La siguiente carga activa la coincidencia de firmas, ya que incluye la etiqueta de secuencias de comandos 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"}}}}}
<!--NeedCopy-->

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

Nota

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

Resumen

  • Para proteger la carga útil de JSON, utilice las firmas de Web App Firewall para detectar las secuencias de comandos entre sitios, el 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 coincida con el tipo de contenido JSON configurado.
  • Asegúrese de que todos los patrones configurados en la regla de firma coincidan para que se active la infracción de firma.
  • Al añadir una regla de firma, DEBE tener al menos un patrón de regla para que coincida con la expresión de la carga útil de JSON. Todas las expresiones PI de las reglas de firma deben empezar por el prefijo TEXT. y deben ser booleanas.

Proteja el contenido de la aplicación o el tipo JSON con una carga útil codificada para SQL y secuencias de comandos entre sitios mediante directivas y firmas

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

Inspeccione el tipo de contenido de la aplicación o JSON para la inyección de 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 del perfil del firewall de la aplicación para admitir la inyección de 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>

<!--NeedCopy-->