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 Quiz Seguridad

Quiz de la semana sobre PHP

El siguiente código, aparte de mostrar lo mal que programo :), contiene algunos errores graves; en realidad, esta porción de código intenta reproducir un error observado en otra aplicación 😛 .

Categories
PHP Quiz Seguridad

Implicancias de la codificación del documento

En esta edición del quiz, un poco sobre la influencia que tiene la codificación de una página que se envía al cliente.

php:

<?php

$charset = 'utf-8';

/* Comprobación simple del charset: no debe contener caracteres raros  */
if ( !empty($_GET['charset']) && preg_match('/^[a-z\d-]+$/i', $_GET['charset']) )
        $charset = $_GET['charset'];
       
header('Content-type:text/html; charset=' . $charset);

?>
<html>

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

<body>

<?php

if ( !empty($_GET['url']) )
        echo sprintf('<a href="%s">Enlace</a>', htmlentities($_GET['url']));

?>

</body>

</html>

¿Qué problema o problemas existen en el código mostrado?

Solución

Una alternativa de solución, es la que comenta Francesc, sin embargo la funcion htmlentities no acepta todos los encodings, lo que podría conllevar a que el código mostrado sea vulnerable a ataques XSS, para evitar esto, lo mejor es evitar que el usuario establezca el encoding del documento.

Categories
PHP Quiz Seguridad

Más sobre validación de datos en PHP

Como había mencionado anteriormente, para desarrollar aplicaciones seguras, hay que conocer bien la herramienta o lenguaje con el que se trabaja. Espero que estos pequeños quiz intenten mostrar algunas de las fallas más comunes que cometen los que recién empiezan o ya desarrollan con PHP.

El código mostrado a continuación, ¿tiene alguna falla? ¿cuál?

php:

<?php

if      ( empty( $_GET['user'] ) && empty( $_POST['user'] ) )
        die( 'Bad parameter' );
elseif ( ! empty( $_GET['user'] ) && intval( $_GET['user'] ) < 0 )
        die( 'Bad parameter' );
elseif ( ! empty( $_POST['user'] ) && intval( $_POST['user'] ) < 0 )
        die( 'Bad parameter' );

$sql = 'SELECT  id, name, email
        FROM    users
        WHERE   id = '
. mysql_real_escape_string($_REQUEST['user']);

echo $sql;

?>

Como ya saben, el código mostrado sólo es referencial, pero vale comentar la forma correcta de implementar ese pedazo de código.

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.