Blog sobre seguridad informática, privacidad, anonimato, hacking ético, programación y sistemas operativos en general.

miércoles, 23 de agosto de 2017

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


El Cross Site Scripting (XSS) es un tipo de vulnerabilidad que normalmente se presenta en páginas web, la cual permite al atacante inyectar y ejecutar códigos maliciosos en el servidor o CMS remoto. El XSS es una de las vulnerabilidades más comúnmente encontradas en sitios web y la principal razón de su existencia es que el administrador de una página confia en lo que el usuario introduce desde el teclado y le brinda información de acuerdo a su consulta, entonces el usuario puede introducir scripts específicos con código malicioso y de esta manera obtener información que el desee para un posterior ataque.

* ¡EL XSS ES PELIGROSO!

Aunque es una de las vulnerabilidades más conocidas y que muchas veces pasa desapercibida, el XSS es realmente una vulnerabilidad peligrosa, permite en ciertos casos cambiar el dominio del sitio web, redireccionarlo, robar credenciales del administrador y comprometer los datos que contenga el sitio web. ¡Todo depende de tus conocimientos y tu ingenio!

* ¿Que puede realizar el atacante por medio de esta vulnerabilidad?

1. Cambiar configuraciones.
2. Robo de cookies.
3. Robar tokens para hacer un CSRF (Cross Site Request Forgery) más fácil.

Como dijimos, debes ser creativo para explotar un XSS.

* TIPOS DE XSS.

1. Reflejado: Es el tipo de XSS menos peligroso y solo permite una modificación parcial del sitio web, para que otros lo vean el usuario debe enviar un link "especial" con el contenido a inyectar. Aquí un ejemplo de un código PHP vulnerable a XSS reflejado:

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

Como podemos ver el parámetro nombre no está definido correctamente ya que este devuelve un "echo" a el usuario, de manera que podemos ingresar un código JS del tipo <script>alert(/xss/)</script> y este lo ejecutará como tal.

2. Persistente: Este tipo de ataque es almacenado en el servidor y por lo tanto es visible a cualquier persona que ingrese al sitio web atacado. Este tipo de vulnerabilidad se presenta cuando los datos recolectados desde el teclado del usuario son guardados en el servidor y que son vistos normalmente en cualquier página que returne el mismo. Un ejemplo claro son los "chan's" o "boards" donde un usuario escribe un comentario que puede ser visto por otros usuarios. Aquí un ejemplo de un código PHP vulnerable a XSS persistente:

<?php
if(isset($_POST['btnSign']))
{
$mensaje=trim($_POST['mtxMensaje']);
$nombre=trim($_POST['txtnombre']);
// Entrada del mensaje
$mensaje = stripslashes($mensaje);
$mensaje = mysql_real_escape_string($mensaje);
// Entrada del nombre
$nombre = mysql_real_escape_string($nombre);
$query = "INSERT INTO guestbook (comentario,nombre) VALUES (
'$mensaje','$nombre');";
$result=mysql_query($query) or die('<pre>'.mysql_error().'</pre>');
}
?>

Las entradas de nombre y mensaje no están declaradas de manera correcta, ya que guardan los datos que reciben en la tabla guestbook y cuando el servidor returna esos datos al cliente este puede ejecutar código JS (JavaScript) malicioso que quedará almacenado en el servidor.


3. XSS basado en DOM (Document Object Model o Modelo de Objetos del Documento): Este tipo de XSS es una variante del XSS persistente. El DOM es un conjunto estandarizado de objetos para representar páginas web con JavaScript, lo cual permite abrir otra página web con código malicioso JavaScript incrustado, afectando el código de la primera página en el sistema local. Cuando el XSS es local, ningún código malicioso es enviado al servidor. El funcionamiento toma lugar completamente en la máquina del cliente, pero modifica la página proporcionada por el sitio web antes de que sea interpretada por el navegador para que se comporte como si se realizara la carga maliciosa en el cliente desde el servidor. Esto significa que la protección del lado del servidor que filtra el código malicioso no funciona en este tipo de vulnerabilidad.

A continuación usaremos la aplicación DVWA para realizar las demostraciones.

* XSS Reflejado.


Esto ocurre el introducir en el espacio "What's your name?" el cual es vulnerable a XSS Reflejado el siguiente texto: <script>alert("Esto+es+un+ejemplo+de+XSS+reflejado+by+SecHackLabs!")<%2Fscript>

* XSS Persistente.


Como vemos, este apartado funciona como un foro donde cada usuario deja su nombre y su mensaje. Pero ahora veamos que pasa si insertamos un nombre cualquiera y en mensaje algo como <script>alert("Aquí hay un XSS persistente!");</script>


Pues obtenemos un XSS persistente, el cual permanecerá ahí aunque recarguemos la página desde otro dispositivo y otra red.

* XSS DOM Based.

Supongamos que el siguiente código es usado para mostrarle a un usuario la opción de elegir su lenguaje preferido. Un lenguaje por defecto también es proporcionado en caso de que no haya elección alguna por parte del usuario, aquí una demostración:

<select>
<script>
document.write("<OPTION value=1>"+document.location.href.substring
(document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>Spanish</OPTION>");
</script>
</select>

La página es invocada de una manera similar a esta: http://www.Xsitio.com/page.html?default=English

Un atacante puede usar esta web para enviársela a una víctima de la siguiente manera: http://www.Xsitio.com/page.html?default=<script>alert(document.cookie)</script>

El código JS original no esperaba que el parámetro Default tuviera código HTML como tal, por lo tanto este lo ejecuta dentro la página (DOM) y el navegador devuelve la página resultante al ejecutar la sentencia alert(document.cookie) que el atacante envió.
En el próximo post explicaremos técnicas avanzadas sobre cómo bypassear protecciones anti-XSS, firewalls y filtros, así como también dejaremos un par de scripts los cuales nos facilitarán llevar a cabo un robo de sesión, cookies, entre otros.

Dejen sus recomendaciones en los comentarios. Síguenos en Facebook, Twitter y unete a nuestra charla en Riot. También puedes dejar su donación a nuestra cuenta Paypal.

2 comentarios:

  1. Está buenísimo el post!!! Una ves fui víctima del robo de mi cache de mi navegador mi robaron cuentas de redes sociales que lo tenía guardado en el navegador las credenciales �� Como puede saber que hicieron y como hicieron para robar mi cache?��

    ResponderBorrar
    Respuestas
    1. Normalmente el atacante usa códigos JS (JavaScript) ocultos en enlaces, lo más probable es que lo hicieron usando la vulnerabilidad XSS DOM Based de un sitio web que visitabas o bien usando un XSS persistente y modificando las configuraciones del sitio. Nuestra recomendación es que siempre uses un navegador actualizado y de código abierto, me refiero a Firefox. Aquí te enseñamos como protegerte de la mayoría de ataques: https://securityhacklabs.blogspot.com.co/2016/09/como-navegar-de-manera-segura-sin-ser.html

      Borrar