Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

Vulnerabilidad de inyección SQL en la cláusula WHERE que permite la extracción de datos ocultos.

Información del laboratorio

https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data

En este laboratorio hay una vulnerabilidad de inyección SQL en el filtro de la categoría del producto.

Cuando el usuario selecciona una categoría, la aplicación realiza una consulta SQL como la siguiente:

SELECT * FROM products WHERE category = 'Accessories' AND released = 1

Flujo de explotación

Captura de la petición

Para capturar la petición, se realiza click sobre la funcionalidad de filtrado:

Tras ello, se captura la petición en Burp. Para poder identificar si es vulnerable a SQLi y manipular la consulta de forma que obtengamos la información que queramos, se pueden probar múltiples payloads.

Respuesta sin modificar

Primero hay que observar cuál es la respuesta sin alterar, de forma que posteriormente al insertar el payload podamos identificar el cambio en el comportamiento.

  • Petición:

GET /filter?category=Accessories HTTP/2

Host: 0a5f004c03a7205380b7d16a00b1009b.web-security-academy.net

Cookie: session=rkEdMX4V5gH6e1eu06nf4HRxl2bVD5VH

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://0a5f004c03a7205380b7d16a00b1009b.web-security-academy.net/filter?category=Accessories
  • Respuesta sin modificar:

Petición modificada con payload '--

Por ejemplo, sabiendo que la consulta realizada es:

SELECT * FROM products WHERE category = 'Accessories' AND released = 1

Se podría insertar el payload '--, que provocaría que la consulta quedara de la siguiente forma y muestre los items sin que cumplan la condición released = 1:

SELECT * FROM products WHERE category = 'Accessories'--' AND released = 1

Con dicha modificación la petición mostraría un item más, esto confirma que hemos podido alterar la consulta:

Ahora vamos a modificarla de forma que se pueda obtener toda la información de los items, para ello, se puede usar una consulta lógica que siempre se cumpla, y por lo tanto, obtengamos todos los datos sin filtrar.

Petición modificada con payload 'or'1337'='1337'--

Existen múltiples payloads que permiten provocar que una condición se cumpla, el payload elegido dependerá de muchos factores. Un ejemplo clásico es usar un operador lógico OR que se añada a la consulta y que al cumplirse siempre, muestre toda la información.

Por ejemplo, sabiendo que la consulta realizada es:

SELECT * FROM products WHERE category = 'Accessories' AND released = 1

Se podría insertar el payload '--, que provocaría que la consulta quedara de la siguiente forma y muestre los items sin que cumplan la condición released = 1:

SELECT * FROM products WHERE category = 'Accessories'or'1337'='1337'--' AND released = 1

Con dicha modificación la petición mostraría todos los items de la tabla products, ya que 1337 siempre es igual a 1337:

Última actualización

¿Te fue útil?