La palabra clave UNION  ayuda a la explotación porque permite la ejecución de una instrucción SELECT adicional y proporciona los resultados en la misma consulta, concatenando así dos consultas en una instrucción.

Para que los ataques UNION SQLi funcionen, primero debemos cumplir dos condiciones:

  1. La consulta UNION

    inyectada debe incluir el mismo número de columnas que la consulta original.

  2. Los tipos de datos deben ser compatibles entre cada columna.

Antes de diseñar cualquier estrategia de ataque, necesitamos saber el número exacto de columnas presentes en la tabla de destino.

Para descubrir el número correcto de columnas, podemos enviar la siguiente consulta inyectada en el campo de inut de usuario:

' ORDER BY 1-- //

Y seguir incrementando el número hasta que nos de error, como aquí, a la columna 6 nos ha dado error, por lo que nos indica que estamos tratando en una tabla con 5 columnas:

34889ebae67344beee8337e6e122cf0d-union2.png

Con esta información en mente, podemos intentar nuestro primer ataque enumerando el nombre de la base de datos actual, el usuario y la versión de MySQL.

' UNION SELECT null, null, database(), user(), @@version -- //

f485572f56d54c0cdff7010613f1ad47-union4.png

Ahora, podemos enumerar otras tablas en la base de datos actual, para ello vamos a extraer columnmas y tablas de information_shema que pertenezca a la actual base de datos.

' union select null, table_name, column_name, table_schema, null from information_schema.columns where table_schema=database() -- //

283e09223e6ed889bd4830f52aea6b18-union5.png

Este output confirma que las terceras columnas confirman el nombre de la tabla, de la columna y de la base de datos actual, y podemos ver que hay una tabla lalmada users que contiene cuatro columnas, id, username, password y description, vamos a intentar dumpearla:

' UNION SELECT null, username, password, description, null FROM users -- //

c3e1a976980eb05221d67b87c034c33b-union6.png