Lab: SQL injection UNION attack, retrieving multiple values in a single column – Portswigger [Write Up]

Este laboratorio sería la continuación del anterior SQL injection UNION attack, donde extraíamos el usuario y contraseña del administrator mediante inyección de SQL comando UNION attack en la consulta a la BBDD del servidor.

En este caso, usaremos como siempre Burp Suite y así capturar la solicitud HTTP y modificar el parámetro category que está enviando el cliente. Esto nos permitirá insertar el payload para manipular la consulta SQL ejecutada en el servidor y conseguir datos de otras tablas.

En este caso el objetivo de nuevo es conseguir las credenciales del administrator para logarnos en el panel, y para ello vamos a modificar la consulta basándonos en la misma estructura del payload que el anterior lab, sólo que en esta ocasión además se va a hacer una variante ya que los datos están en una única columna.

Como siempre, este Lab se encuentra dentro del listado de laboratorios de la plataforma de Portswigger Web Security Academy dentro de la vulnerabilidad SQL injection como Practitioner.

Inicialmente lo que hacemos es acceder a la página del laboratorio, y antes de clicar en cualquier categoría, abrimos BurpSuite dentro de Kali, activamos «On» la petición y activamos el FoxyProxy para enviar a Burp la petición y así manipularla.

Clicamos en cualquier categoría, vamos a la petición GET en la pestaña Proxy y la enviamos al Repeater con el botón derecho sobre la petición (o Control+R).

Volvemos a aplicar este payload para saber el número de columnas que hay en la tabla:

'+UNION+SELECT+NULL,NULL,NULL-- 

y probando vemos que hay dos columnas:

Ahora lo que queremos es ver cuál/es de ellas contienen texto sobre la que explotar para encontrar las credenciales:

'+UNION+SELECT+NULL,'abc'-- 

y vemos que la segunda columna es la que contiene una cadena string:

Sin embargo, ahora sabemos que la información está en texto toda junta, y lo que queremos es poder separar el nombre de usuario y la contraseña, por lo que aplicamos este comando:

'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

La explicación es:

'+UNION+SELECT+:

  • Al igual que antes, el operador UNION combina el resultado de la consulta original con otra consulta maliciosa que tú defines.

NULL,username||'~'||password:

  • Está seleccionando dos columnas:
    • La primera columna tiene el valor NULL (un marcador para que coincida con el número de columnas de la consulta original).
    • La segunda columna combina (||) el contenido de las columnas username y password de la tabla users.
    • || es un operador de concatenación, que junta los valores de username y password en un solo texto, separados por ~. Por ejemplo, si username es «admin» y password es «1234», el resultado será: admin~1234.

FROM users:

  • Indica que los datos que estás extrayendo provienen de la tabla users.

--: Comenta el resto de la consulta original para que no interfiera con tu payload.

La manipulación devuelve un código 200 exitoso, por lo que vamos al navegador y vemos que los users and passwords están separados por el caracter especial que pusimo antes (se puede incluir el que queramos):

Y ya con el usuario administrator y la contraseña, nos autenticamos en el panel de login y ya tendríamos resuelto el laboratorio.

Otros posts relacionados