Categories
JavaScript Quiz Seguridad Web WordPress XSS

Filtro de datos – Solución

El código mostrado en el último quiz, en realidad es una función de WordPress que era vulnerable a XSS. Pongo la solución en una nueva entrada porque intentaré describir algunos de los errores que cometí al intentar explotar el bug mencionado en una entrada anterior.

Categories
Quiz Seguridad Web XSS

Filtro de datos

Volviendo a los quiz:

php:

<?php

function clean_url( $url ) {
        if ('' == $url) return $url;
        $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%]|i', '', $url);
        $strip = array('%0d', '%0a');
        $url = str_replace($strip, '', $url);
        $url = str_replace(';//', '://', $url);
        $url = (!strstr($url, '://')) ? 'http://'.$url : $url;
        $url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&1', $url);
        return $url;
}

$u = clean_url($_GET['u']);
echo '<a href="' . $u . '">' . $u . '</a>';

?>

¿Qué valor o valores debe tener la variable u para que el código mostrado sea vulnerable a XSS?

Categories
CSS Quiz Seguridad XSS

Validación de datos – Solución

Continuando con la serie, ¿qué cosas se tienen que cumplir para que el siguiente código sea vulnerable a XSS?

php:

<?php
/* Evitar XSS a través de otros formatos */
header('Content-type: text/html; charset=utf-8;');

$color = '000';
if ( !empty($_GET['color']) ) {
        $color = htmlentities(strip_tags($_GET['color']));
}

?>
<html>

<head>
        <title>Anti XSS Page :D</title>
        <style type="text/css">
        #demo {
                width: 100%;
                height: 50px;
                background: #<?php echo $color;  ?>;
        }
        </style>
</head>

<body>

<div id="demo">

</div>

</body>

</html>

Categories
PHP Quiz Seguridad

Cuando los filtros no hacen lo que deberían – Parte 2

La siguiente función era utilizada para validar los datos en una aplicación web -es una versión modificada del método que trae ezSQL

php:

function escape($text) {
        return mysql_real_escape_string(stripslashes(strip_tags($text)), $this->connection);
}

Se usaba de la siguiente manera:

php:

// agregar.php
<?php

if (!empty($_POST['url']) && !empty($_POST['title'])) {
        $sql = "INSERT IGNORE INTO links (url, title) VALUES ('%s', '%s')"; // ignorar los links repetidos
        $db->query(sprintf($sql, $db->escape($_POST['url']), $db->escape($_POST['title'])));
}

?>

php:

// listar.php
<html>

<head>
        <title>Demo</title>
</head>

<body>

<?php $links = $db->get_results('SELECT url, title FROM links'); ?>

<ul>
<?php foreach ($links as $link) : ?>
        <li><a href="<?php echo $db->escape($link->url); ?>">
                <?php echo $db->escape($link->title); ?></a></li>              
<?php endforeach; ?>
</ul>

</body>

</html>

¿Pueden identificar donde está el error?

Nota: la respuesta al quiz sobre validación de datos, todavía queda pendiente a pedido de Victor.

Categories
PHP Quiz Seguridad XSS

Cuando los filtros no hacen lo que deberían

El código que se muestra a continuación, es un ejemplo simplificado del comportamiento que ofrece en una de sus secciones, un -importante- diario español.