5 dic 2012

Filtrando XSS en .Net, PHP y J2EE (Parte II de II)

Buenas a todos, hoy continuaremos con la cadena de artículos sobre XSS, analizando como proteger estas vulnerabilidades en los lenguajes J2EE, PHP y .Net:

J2EE

  • En J2EE podremos utilizar mecanismos de salida de Struts.

A continuación se muestra un ejemplo básico que utiliza páginas dinámicas JSP. Cuando se accede a la página, esta muestra el pais del usuario. Para ello, recupera sus datos en el objeto “User”.

<bean:write name="User" property="Country"/>

¿Qué ganamos con ello? básicamente que todos los datos que se escriban del país serán interpretados como texto (nunca como contenido activo)

  • Otra alternativa es utilizar las librerías JSTL, en concreto la librería Core. Mediante dicha librería, con el atributo escapeXML=”true”, se le indica al navegador que interprete la cadena como texto (nunca como HTML):
<c:out value="<p>Hi world!</p>" escapeXml="true" />

 

.NET

  • Una de las mejores alternativas en .Net es hacer uso de la librería de Microsoft Anti-XSS, que podéis descargar gratuitamente desde aquí.

Supongamos que el siguiente ejemplo mostrase un mensaje de bienvenida obteniendo el nombre de un usuario la URL. Este ejemplo sería vulnerable a XSS:

http://www.antiXSS.com/index.aspx?name=Perico

Para evitarlo en .Net utilizaríamos el siguiente código:

<HTML>Hola, <%=AntiXss.HtmlEncode(Request.QueryString["name"])%></HTML>

PHP

  • En PHP podremos hacer uso de las funciones htmlentities() o htmlspecialchars()

A continuación se muestra un ejemplo de una aplicación web con un formulario que tiene un campo donde el usuario introduce su nombre, este campo utiliza funciones de filtrado para evitar ataques XSS:

$clean=array();$_POST['usuario']; //  Lee la cadena introducida por el usuario$clean['usuario'] = htmlentities($_POST['usuario'], ENT_QUOTES);
  • Otra opción es hacer uso de la función preg_match() para aceptar únicamente valores de entrada que coincidan con un patrón especificado. A continuación se muestra un patrón que sólo permite caracteres del rango de la a-z.
If (preg_match("^[a-z]+$/i",$_GET['nombre'])){$clean['user_login'] = $_GET['nombre'];}
 Eso es todo por hoy,Saludos!

3 comentarios:

  1. Para PHP también podria ser strip_tags.

    ResponderEliminar
  2. Saludos. Confiar en htmlentities sin más, no es bueno. Tal y como has puesto la función ahí, no estás filtrando las comillas simples. Si miras la documentación oficial ( http://us3.php.net/htmlentities ) verás que si no añades ningún flag, por defecto utiliza ENT_COMPAT, que sólo convierte las comillas dobles. Pese a utilizar htmlentities, es posible hacer un bypass en muchas ocasiones. Por ejemplo, en el siguiente caso:<input type='text' value='' />Como no está definido ENT_QUOTES, podemos meterle comillas simple y ejecutar JavaScript:x' onblur=alert(/XSS/) autofocus='autofocusPruebalo :) (el alert se lanza cuando haces click en alguna parte)Un saludo

    ResponderEliminar
  3. @The X-C3LL Modificado ;) En estos artículos de todas maneras como habréis visto hemos querido contar simplemente las distintas posibilidades para filtrar XSS, no hemos profundizado en ninguna de ellas, de manera que solo las hemos definido y hemos puesto un ejemplo de como llamar a la función en cada caso. Obviamente queda trabajo detrás, viendo flags, parámetros, etc. que se adapten a cada caso concreto. Cuando tengamos más tiempo intentaremos dedicar un post a cada una de ellas.@wlan0, correcto, se nos pasó añadir strip_tags (y eso que la usamos en el código del servidor web de Flu :P)Gracias a ambos!

    ResponderEliminar