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.
Category: Quiz
Pequeños quiz sobre diferentes lenguajes
Volviendo a los quiz:
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?
Continuando con la serie, ¿qué cosas se tienen que cumplir para que el siguiente código sea vulnerable a XSS?
/* 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>
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
return mysql_real_escape_string(stripslashes(strip_tags($text)), $this->connection);
}
Se usaba de la siguiente manera:
<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.
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.