XUT_ / COURSES / PENETRATION TESTER

Basic CSRF - Hidden Link-Image Exploitation

Vista General

Una técnica cubierta conocida como "hidden link/image exploitation" en CSRF involucra a un atacante insertando una imagen de 0x0 píxeles o un link en una página web que sea prácticamente indetectable para el usuario. Típicamente el elemento src o href es configurado a la dirección de destino intencionada para actuar en nombre del usuario sin su conocimiento. Se aprovecha del hecho de que el navegador del usuario transfiere credenciales como cookies automáticamente.

html
<!-- Website --> 
<a href="https://mybank.thm/transfer.php" target="_blank">Click Here</a>  
<!-- User visits attacker's website while authenticated -->

Esta técnica se basa en sesiones autentificadas y utiliza ingeniería social para acercarse al usuario


Cómo Funciona

Ahora que estás conectado a la VM, vamos a ver cómo funciona el ataque:

  • La máquina virtual representa la máquina de Josh, que usa Chrome para comprobar su email (http://mailbox.thm:8081) e iniciar sesión en su cuenta del banco (http://mybank.thm:8080). Debido a que es broker y debe hacer muchas transferencias diariamente, mantiene su sesión activa en el navegador todo el día.
  • El atacante, de alguna manera, averigua que Josh usa mybank.thm:8080 para transacciones y que su cuenta siempre está activa.
  • El atacante también tiene una cuenta en el mismo banco, por lo que inicia sesión y busca vulnerabilidades.
  • Tú también puedes iniciar sesión en la cuenta de banco usando GB82MYBANK5698:GB82MYBANK5698.
  • Mientras escanea, encuentra que no se manda ningún parámetro adicional de la app de banco al transferir el pago. Este es el código que maneja la transferencia de fondos.
php
<?php 
<form action="transfer.php" method="post">

    <label for="to_account">To Account:</label>
    <input type="text" id="to_account" name="to_account" required>

    <label for="amount">Amount:</label>
    <input type="number" id="amount" name="amount" required>

    <button type="submit">Transfer</button>
</form>
  • Aquí, el atacante puede emplear la técnica de la imagen escondida para construir un email y engañar a la víctima para que haga click en el link. El atacante sólo conoce la dirección de email de Josh por lo que lanza un ataque de ingeniería social mandándole el siguiente email.

Basic CSRF - Hidden Link-Image Exploitation

  • Lo más importante es que el atributo src de la imagen está configurado a la página de transferencia del banco. El atacante puede esconderlo o poner una imagen válida con la etiqueta anchor (<a>).
html
<a href="http://mybank.thm:8080/dashboard.php?to_account=GB82MYBANK5698&amount=1000" target="_blank">Click Here to Redeem</a>
  • Pare entender la perspectiva de la víctima, navega hasta la bandeja de entrada de Josh en mailbox.thm:8081 para ver un nuevo email diciendo que ha ganado un viaje a Dubai y tiene que reclamarlo.
  • Una vez que hace click en el link, se le redirige a la página del banco de transferencias y los fondos son transferidos automáticamente.

Basic CSRF - Hidden Link-Image Exploitation


Todas las validaciones son correctas y precisas, sin embargo, el servidor no valida si la petición viene de un usuario legítimo.


Securizando la Brecha

  • Desde el punto de vista de un pentester, es vital testear cada parámetro de petición y respuesta del formulario.
  • Desde el punto de vista del desarrollador, es importante asegurar que cada petición subida al servidor web contiene un token único para que el servidor pueda identificar si se ha hecho click a partir de un enlace válido.
  • El equipo IT del banco identifican rápidamente el problema y añaden un token CSRF con cada petición subida al servidor. El siguiente código contiene el código actualizado del lado del cliente. Podemos ver que hay un parámetro extra escondido, csrf_token, que será mandado al servidor con cada petición.
html
<form method="post" action="">
        <label for="password">Password:</label>
        <input type="password" id="password" name="current_password" required>

        <label for="confirm_password">ConfirmPassword:</label>
        <input type="password" id="confirm_password" name="confirm_password" required>
		<input type="hidden" id="csrf_token" name="csrf_token" value="<?php echo $_COOKIE['csrf-token']; ?>">
        <button type="submit" name="password_submit" >Update Password</button>
    </form>submit">
</form> 
  • Del lado del servidor, este verificará si cada petición entrante contiene un token único, de no ser así lo rechaza.
  • Abre la bandeja de entrada de Josh y navega hasta el email del atacante con la chapa verde.

Basic CSRF - Hidden Link-Image Exploitation

  • Cuando el usuario hace click en el link, no transferirá los fondos ya que a la petición le falta el token CSRF único.

Basic CSRF - Hidden Link-Image Exploitation