Prevención de ataques de inyección CSRF, XSS y SQL en JSF


Tengo una aplicación web construida sobre JSF con MySQL como base de datos. Ya he implementado el código para evitar CSRF en mi aplicación.

Ahora, dado que mi framework subyacente es JSF, supongo que no tengo que manejar el ataque XSS, ya que ya está manejado por UIComponent. No estoy usando ningún JavaScript en ninguna de las páginas de vista. Incluso si utilizo ¿realmente necesito implementar código para evitar ataques XSS?

Para DB estamos utilizando instrucciones preparadas y procedimientos almacenados en todos los DB interacción.

¿Hay algo más que se deba manejar para prevenir estos 3 ataques comunes? Ya he revisado el sitio de OWASP y sus hojas de trucos .

¿Necesito ocuparme de otros vectores de ataque potenciales?

Author: Antti Haapala, 2011-10-11

2 answers

XSS

JSF está diseñado para tener prevención XSS incorporada. Puede volver a mostrar de forma segura todas las entradas controladas por el usuario (encabezados de solicitud (incluidas las cookies!), parámetros de solicitud (también los que se guardan en DB!) y cuerpos de solicitud (archivos de texto cargados, etc)) utilizando cualquier componente JSF.

<h:outputText value="#{user.name}" />
<h:outputText value="#{user.name}" escape="true" />
<h:inputText value="#{user.name}" />
etc...

Tenga en cuenta que cuando está utilizando JSF 2.0 en Facelets, entonces puede usar EL en el texto de la plantilla de la siguiente manera:

<p>Welcome, #{user.name}</p>

Esto también se escapará implícitamente. No necesariamente necesitan <h:outputText> aquí.

Solo cuando estás explícitamente desescapando entrada controlada por el usuario usando escape="false":

<h:outputText value="#{user.name}" escape="false" />

Entonces tienes un agujero de ataque XSS potencial!

Si desea volver a mostrar la entrada controlada por el usuario como HTML en el que desea permitir solo un subconjunto específico de etiquetas HTML como <b>, <i>, <u>, etc, entonces usted necesita desinfectar la entrada por una lista blanca. El analizador HTML Jsoup es muy útil en este.

itemLabelEscaped error en Mojarra

Las versiones anteriores de Mojarra antes de 2.2.6 tenían el error en el que <f:selectItems itemLabel> incorrectamente renderiza la etiqueta sin escapar cuando se proporciona un List<T> a través de <f:selectItems var> en lugar de List<SelectItem> o SelectItem[] como valor ( problema 3143). En otras palabras, si estás volviendo a mostrar datos controlados por el usuario como etiquetas de elementos a través de un List<T>, entonces tienes un agujero XSS potencial. Si actualizar a al menos Mojarra 2.2.6 no es una opción, entonces necesita establecer explícitamente itemLabelEscaped atributo a true para evitar eso.

<f:selectItems value="#{bean.entities}" var="entity" itemValue="#{entity}"
    itemLabel="#{entity.someUserControlledProperty}" itemLabelEscaped="true" />

CSRF

JSF 2.x ya ha incorporado la prevención de CSRF en el tipo de javax.faces.ViewState campo oculto en el formulario cuando se utiliza el ahorro de estado del lado del servidor. En JSF 1.x este valor era a saber bastante débil y demasiado fácil predecible (en realidad nunca fue pensado como prevención CSRF). En JSF 2.0, esto se ha mejorado mediante el uso de un valor autogenerado largo y fuerte en lugar de un valor de secuencia bastante predecible, lo que lo convierte en un CSRF robusto prevención.

En JSF 2.2 esto se puede mejorar aún más al convertirlo en una parte requerida de la especificación JSF, junto con una clave AES configurable para cifrar el estado del lado del cliente, en caso de que se habilite el ahorro de estado del lado del cliente. Véase también JSF spec issue 869 y Reutilizando el valor ViewState en otra sesión (CSRF). Nuevo en JSF 2.2 es la protección CSRF en las solicitudes GET por <protected-views>.

Solo cuando estás usando vistas sin estado como en <f:view transient="true">, o hay en algún lugar de un agujero de ataque XSS en la aplicación, entonces usted tiene un potencial agujero de ataque CSRF.


Inyección SQL

Esto no es responsabilidad de JSF. Cómo evitar esto depende de la API de persistencia que esté utilizando (JDBC en bruto, JPA moderna o buena hibernación), pero todo se reduce a que debe nunca concatenar la entrada controlada por el usuario en cadenas SQL como así

String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = md5(" + password + ")";
String jpql = "SELECT u FROM User u WHERE u.username = '" + username + "' AND u.password = md5('" + password + "')";

Imagine lo que sucedería si el usuario final elige lo siguiente nombre:

x'; DROP TABLE user; --

Debe siempre usar consultas parametrizadas cuando corresponda.

String sql = "SELECT * FROM user WHERE username = ? AND password = md5(?)";
String jpql = "SELECT u FROM User u WHERE u.username = ?1 AND u.password = md5(?2)";

En JDBC plano debe usar PreparedStatement para llenar los valores de los parámetros y en JPA (e Hibernar), el Query object también ofrece setters para esto.

 98
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-31 14:08:45

No estoy usando ningún JavaScript en ninguna de las páginas de vista. Incluso si utilizo do realmente necesito implementar código para evitar el ataque XSS.

Puede ser vulnerable a XSS incluso si no utiliza JavaScript en sus páginas. XSS ocurre cuando se incorpora contenido controlado por un atacante sin codificarlo correctamente.

En cualquier momento haces algo como

response.write("<b>" + x + "</b>")

Donde un atacante puede hacer que x contenga HTML que contenga JavaScript, entonces usted es vulnerable a XSS.

La solución no suele ser escribir grandes cantidades de código. Por lo general, la solución es codificar $x y cualquier otro valor controlado por un atacante antes de incluirlos en el HTML que genere.

response.write("<b>" + escapePlainTextToHtml(x) + "</b>")

Filtrar o desinfectar las entradas puede ayudar a proporcionar una capa adicional de protección.

<shameless-plug>

También puede usar un lenguaje de plantilla que codifique la salida automáticamente para protegerse contra XSS.

Cierre Template es una de esas opciones para Java.

Contextual autoescaping funciona aumentando las plantillas de cierre para codificar correctamente cada valor dinámico en función del contexto en el que aparece, defendiendo así contra vulnerabilidades XSS en valores que son controlados por un atacante.

EDITAR

Dado que está utilizando JSF, debe leer sobre Mitigación XSS en JSF :

Texto de salida de escape

<h:outputText/> y <h:outputLabel/> por defecto tiene el atributo escape establecido en True. Al usar esta etiqueta para mostrar las salidas, puede mitigar la mayoría de la vulnerabilidad XSS.

SeamTextParser y <s:formattedText/>

Si desea permitir que los usuarios utilicen algunas de las etiquetas html básicas para personalizar sus entradas, JBoss Seam proporciona una etiqueta <s:formattedText/> que permite algunas etiquetas html básicas y estilos especificados por los usuarios.

 8
Author: Mike Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-11 08:23:49