Anuncia aquí

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.

Esta entrada fue publicada en PHP, Quiz, Seguridad, XSS

4 Comentarios

  1. 1 Edu (22 de noviembre de 2006, 04:32:28 am)

    Creo que es importante que la cabecera del documento indique que estamos trabajando en UTF-8.

    Con estos 2 ejemplos que podéis probas, se puede ver la importancia:

    alert('BUYACORP');";
    $cadena = mb_convert_encoding($cadena, 'UTF-7');
    echo htmlentities($cadena, ENT_COMPAT, 'UTF-8');
    ?>

    alert('BUYACORP');";
    $cadena = mb_convert_encoding($cadena, 'UTF-7');
    echo htmlentities($cadena, ENT_COMPAT, 'UTF-8');
    ?>

  2. 2 alex (22 de noviembre de 2006, 07:57:56 am) http://www.buayacorp.com

    En parte tienes razón, porque tiene que ver con los encodings, pero ¿cómo insertarías HTML en el código mostrado? ¿en qué casos funcionaría?

  3. 3 Edu (22 de noviembre de 2006, 11:47:55 am)

    Quizás usando codificacion ascii a decimal??

    cadena = alert(String.fromCharCode(66,85,89,65,67,79,82,80));

  4. 4 alex (22 de noviembre de 2006, 01:38:35 pm) http://www.buayacorp.com

    Si pones ese valor, el html resultante sería:

    html:
    <html>
     
    <head>
           
    </head>
     
    <body>
     
    alert(String.fromCharCode(66,85,89,65,67,79,82,80));
     
    </body>
     
    </html>

    Como puedes ver, no representa ningún peligro ese valor.

Publicar un Comentario

Tu email nunca será publicado o compartido. Los campos requeridos están marcados con un *

*
*

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>