jueves, 6 de diciembre de 2012

Htmlentities no es la panacea

Saludos.


    Echando un ojo a los posts de Flu-Project (donde @Aetsu colabora todas las semanas) vi un post donde daban algunas directivas para prevenir XSS en distintas plataformas, cosa que está muy bien, ya que muchas veces nos centramos en el ataque y nos olvidamos de la mitigación. En general el post está muy bien y es recomendable, porque recomiendan varias formas, y no se quedan sólo con el htmlentities.


     Al ver esepost, empecé a indagar un poco, y me di cuenta que en muchos sitios recomiendan en uso de htmlentities para evitar desgracias, como si fuese la panacea. Te dicen que haces un htmlentities($_GET['var']) y ¡puf!, ya está todo resuelto. Y no es oro todo lo que reluce.


               Si nos vamos a la documentación de PHP podremos ver que "Por defecto es ENT_COMPAT | ENT_HTML401.", lo que significa que:



ENT_COMPAT Convertirá las comillas dobles y deja solo las comillas sencillas.



   Osea, que si hacemos símplemente htmlentities($variable), vamos a permitir que las comillas simples continúen ahí, lo que probablemente sea un impedimento para mucha gente, pero sigue siendo vulnerable. Por ejemplo:

<?php
$var = htmlentities($_GET['test']);
echo "<input type='text' value='$var' />";
?>
  En primera instancia parece que estamos evitando que nos roben las galletas, hacemos un htmlentities y todos felices... ¿o no? Al poder meter comillas simples, podemos romper el value='__' y meter algún evento con el que ejecutar JavaScript:

foo' onblur=alert(/0verl0ad/) autofocus='autofocus

    Byt3z
5 0verl0ad Labs: Htmlentities no es la panacea Saludos.     Echando un ojo a los posts de Flu-Project (donde @Aetsu colabora todas las semanas) vi un post donde daban algunas directiv...

3 comentarios:

Neutron dijo...

Ciertamente es asi, igual si usas htmlspacialchars. Damn it! Hay que usar RegEx para hacer filtros mas complejos.
Gracias por el post, esta bueno!

Saludos!

The X-C3LL dijo...

Efectivamente, lo mejor sin duda es tirar de RegEx para dejar sólo caracteres normales.

De todas formas htmlentities es de utilidad, pero cuando se le añaden los flags correctos.

Loky dijo...

Sip es un error muy común, otro también es la forma incorrecta de usar mysql_real_escape_string()

Tambien es recomendable filtrar el contenido a la salida.

Sobre la Regex, por experiencia es mejor ocuparla en caso especifico y que requieran de verdad su utilidad. Ya que si basas tu seguridad en un patron que haz creado, es muy pero muy probable que facilmente alguien evada ese filtro.

Lo digo por experiencia, yo hace tiempo tenia una aplicación que funcionaba utilizando información de otro sitio (data mining). Parseaba los datos y la verdad tuve muchisimos bugs ya que la mayoria de los datos se generaban por el usuario.
Y al final opte por parsear los datos utilizando el DOM.

Imaginarse que tenia muchos bugs que se generaban sin un propósito maligno, cuanto bug tendría si alguien intentara provocarlo.

< >