Soporte de Web App Firewall para el kit de herramientas web de Google
Nota: Esta función está disponible en la versión 10.5.e de NetScaler.
El firewall de aplicaciones web de NetScaler puede proteger los servidores web que siguen los mecanismos de llamada a procedimientos remotos (RPC) de Google Web Toolkit (GWT) sin necesidad de ninguna configuración específica para habilitar la compatibilidad con GWT.
Qué es GWT
El GWT lo utilizan personas que no tienen experiencia en XMLHttpRequest y JavaScript para crear y optimizar aplicaciones web complejas de alto rendimiento. Este kit de herramientas de desarrollo gratuito y de código abierto se usa ampliamente para desarrollar aplicaciones a pequeña y gran escala y se usa con bastante frecuencia para mostrar datos basados en navegadores, como resultados de búsqueda de vuelos, hoteles, etc. El GWT proporciona un conjunto básico de API y widgets de Java para escribir scripts de JavaScript optimizados que se pueden ejecutar en la mayoría de los navegadores y dispositivos móviles. El marco GWT RPC facilita a los componentes cliente y servidor de la aplicación web el intercambio de objetos Java a través de HTTP. Los servicios GWT RPC no son lo mismo que los servicios web basados en SOAP o REST. Son simplemente un método ligero para transferir datos entre el servidor y la aplicación GWT en el cliente. GWT gestiona la serialización de los objetos Java intercambiando los argumentos de las llamadas a los métodos y el valor devuelto.
Para ver los sitios web populares que utilizan GWT, consulta
https://www.quora.com/What-web-applications-use-Google-Web-Toolkit-%28GWT%29
Cómo funciona una solicitud de GWT
La solicitud GWT RPC está delimitada por canalizaciones y tiene un número variable de argumentos. Se envía como carga útil de HTTP POST y tiene los siguientes valores:
- Tipo de contenido = text/x-gwt-rpc. El conjunto de caracteres puede tener cualquier valor.
- Método = POST.
Tanto las solicitudes HTTP GET como las POST se consideran solicitudes GWT válidas si el tipo de contenido es “text/x-gwt-rpc”. Las cadenas de consulta ahora se admiten como parte de las solicitudes GWT. Configure el parámetro “InspectQueryContentTypes” del perfil de App Firewall en “OTHER” para examinar la parte de consulta de solicitud en busca de contenido “text/x-gwt-rpc”.
El siguiente ejemplo muestra una carga útil válida para una solicitud de GWT:
5|0|8|http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer| myInput1|java.lang.Integer/3438268394|1|2|3|4|2|5|6|7|8|1|
<!--NeedCopy-->
La solicitud se puede dividir en tres partes:
a) Header: 5|0|8|
Los primeros 3 dígitos 5|0|8|
de la solicitud anterior representan “versión, subversión y tamaño de la tabla”, respectivamente. Deben ser números enteros positivos.
b) Tabla de cadenas:
http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer|myInput1| java.lang.Integer/3438268394|
Los miembros de la tabla de cadenas delimitadas por tuberías anterior contienen las entradas proporcionadas por el usuario. Estas entradas se analizan para las comprobaciones de Web App Firewall y se identifican de la siguiente manera:
-
1er:
http://localhost:8080/test/
Esta es la URL de la solicitud.
-
Segundo:
16878339F02B83818D264AE430C20468
Identificador HEX único. Se considera que una solicitud tiene un formato incorrecto si esta cadena contiene caracteres que no son hexadecimales.
-
3º:
com.test.client.TestService
Nombre de clase de servicio
-
4º:
testMethod
Nombre del método de servicio
-
Del 5 en adelante:
java.lang.String|java.lang.Integer|myInput1|java.lang.Integer/3438268394
Tipos de datos y datos. Los tipos de datos no primitivos se especifican como
<container>.<sub-cntnr>.name/<integer><identifier>
c) Payload: 1|2|3|4|2|5|6|7|8|1|
La carga útil consiste en referencias a los elementos de la tabla de cadenas. Estos valores enteros no pueden ser mayores que el número de elementos de la tabla de cadenas.
Protección de firewall de aplicaciones web para aplicaciones GWT
El Web App Firewall comprende e interpreta las solicitudes de GWT RPC, inspecciona la carga para detectar infracciones de los controles de seguridad y toma las medidas específicas.
Las comprobaciones de encabezados y cookies de Web App Firewall para las solicitudes de GWT son similares a las de otros formatos de solicitud. Tras la decodificación de URL y la conversión del conjunto de caracteres adecuadas, se inspeccionan todos los parámetros de la tabla de cadenas. El cuerpo de la solicitud GWT no contiene los nombres de los campos, solo los valores de los campos. Los valores de entrada se pueden validar con el formato especificado mediante la comprobación de formato de campo de Web App Firewall, que también se puede utilizar para controlar la longitud de la entrada. El firewall de aplicaciones web puede detectar y frustrar fácilmente los ataques deinyección de SQLy scripts entre sitios en las entradas.
Reglas de aprendizaje y relajación: lassolicitudes de GWT admiten el aprendizaje y el despliegue de reglas de relajación. Las reglas de Web App Firewall tienen la forma de la asignación <actionURL> <fieldName>. El formato de solicitud GWT no tiene los nombres de campo y, por lo tanto, requiere un manejo especial. El Web App Firewall inserta nombres de campos ficticios en las reglas aprendidas que se pueden implementar como reglas de relajación. El indicador -isRegex funciona igual que para las reglas que no son de GWT.
-
URL de la acción:
Se pueden configurar varios servicios que respondan a un RPC en el mismo servidor web. La solicitud HTTP tiene la URL del servidor web, no la del servicio real que gestiona el RPC. Por lo tanto, la relajación no se aplica en función de la URL de la solicitud HTTP, ya que eso relajaría todos los servicios de esa URL para el campo de destino. Para las solicitudes de GWT, el Web App Firewall utiliza la URL del servicio real que se encuentra en la carga útil de GWT, en el cuarto campo de la tabla de cadenas.
-
Nombre del campo:
Como el cuerpo de la solicitud GWT solo contiene valores de campo, el Web App Firewall inserta nombres de campo ficticios, como 1, 2, etc., cuando recomienda reglas aprendidas.
Ejemplo de una regla aprendida de GWT
POST /abcd/def/gh HTTP/1.1 Content-type: text/x-gwt-rpc Host: 10.217.222.75 Content-length: 157 5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|onblur| The learn data will be as follows: > sh learningdata pr1 crossSiteScripting Profile: pr1 SecurityCheck: crossSiteScripting 1) Url: http://localhost:8080/acdtest/ >> From GWT Payload. Field: 10 Hits: 1 Done <!--NeedCopy-->
Ejemplo de regla de relajación GWT
bind appfw profile pr1 -crossSiteScripting 1 abcd -isregex NOTREGEX
Mensajes de registro: el Web App Firewall genera mensajes de registro para las infracciones de los controles de seguridad que se detectan en las solicitudes de GWT. Un mensaje de registro generado por una solicitud GWT mal formada contiene la cadena “GWT” para facilitar la identificación.
Ejemplo de un mensaje de registro para una solicitud GWT con formato incorrecto:
Dec 5 21:48:02 <local0.notice> 10.217.31.247 12/05/2014:21:48:02 GMT ns 0-PPE-0 : APPFW Message 696 0 : "GWT RPC request with malformed payload. <blocked>”
Diferencia entre el procesamiento de las solicitudes GWT y las que nolo son:
La misma carga puede provocar diferentes infracciones de las comprobaciones de seguridad de Web App Firewall para diferentes tipos de contenido. Considere el siguiente ejemplo:
5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468|com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|select|
Tipo de contenido: application/x-www-form-urlencoded:
Una solicitud enviada con este tipo de contenido provoca una infracción de SQL si el tipo de inyección de SQL está configurado para usar cualquiera de las cuatro opciones disponibles: sqlsplCharandKeyword, sqlsplCharorKeyword, sqlKeyword o sqlsplChar. El Web App Firewall considera que “&” es el separador de campos y que “=” es el separador de nombre-valor al procesar la carga útil anterior. Como ninguno de estos caracteres aparece en ninguna parte del cuerpo de la publicación, todo el contenido se trata como un único nombre de campo. El nombre del campo de esta solicitud contiene un carácter especial de SQL (;) y una palabra clave de SQL (seleccionar). Por lo tanto, se detectan infracciones en las cuatro opciones de tipo de inyección de SQL.
Tipo de contenido: text/x-gwt-rpc:
Una solicitud enviada con este tipo de contenido desencadena una infracción de SQL solo si el tipo de inyección SQL está configurado en una de las tres opciones siguientes: sqlsplCharorKeyword, sqlKeyword o sqlsplChar. No se desencadena ninguna infracción si el tipo de inyección de SQL se establece en sqlsplCharandKeyword, que es la opción predeterminada. El Web App Firewall considera que la barra |
vertical es el separador de campos de la carga útil anterior en la solicitud de GWT. Por lo tanto, el cuerpo de la publicación se divide en varios valores de campo de formulario y se añaden los nombres de los campos de formulario (de acuerdo con la convención descrita anteriormente). Debido a esta división, el carácter especial de SQL y la palabra clave SQL pasan a formar parte de campos de formulario independientes.
Campo de formulario 8: java.lang.String%3b -\> %3b is the (;) char
Campo de formulario 10: select
Como resultado, cuando el tipo de inyección de SQL se establece en SQLSplChar, el campo 8 indica la infracción de SQL. Para SQLKeyword, el campo 10 indica la infracción. Cualquiera de estos dos campos puede indicar una infracción si el tipo SQL Inject está configurado con la opción sqlsplCharorKeyword, que busca la presencia de una palabra clave o un carácter especial. **No se ha detectado ninguna infracción en la opción predeterminada de **SQLSPLCharAndKeyword, ya que no hay ningún campo que tenga un valor que contenga tanto SQLSPLChar como SQLKeyword juntos.**
Consejos:
- No se necesita ninguna configuración especial de Web App Firewall para habilitar la compatibilidad con GWT.
- El tipo de contenido debe ser text/x-gwt-rpc.
- El aprendizaje y la implementación de las reglas de relajación para todas las comprobaciones de seguridad pertinentes de Web App Firewall aplicadas a la carga útil de GWT funcionan de la misma manera que para los demás tipos de contenido compatibles.
- Solo las solicitudes POST se consideran válidas para GWT. Todos los demás métodos de solicitud se bloquean si el tipo de contenido es text/x-gwt-rpc.
- Las solicitudes GWT están sujetas al límite de cuerpo POST configurado del perfil.
- La configuración sin sesión para las comprobaciones de seguridad no es aplicable y se ignorará.
- El formato de registro CEF es compatible con los mensajes de registro GWT.