🛒 GhostCart
GhostCart es una tienda de electrónica de juguete (portátiles, componentes, periféricos), deliberadamente vulnerable, con base de datos SQLite real por debajo — aquí la inyección SQL del primer reto es genuina, no simulada. Corre en local (python app/app.py) y no depende de ningún servicio externo.
Los cinco retos encadenan un mismo hilo argumental: entrar sin credenciales válidas (reto 1), descubrir que pedidos, perfiles y checkouts ajenos se leen cambiando un número en la URL (retos 2 a 4), y terminar secuestrando la cuenta de otra persona por completo (reto 5).
A reconocer una inyección SQL real en un formulario de login, y sobre todo a interiorizar el patrón IDOR (Insecure Direct Object Reference): cualquier endpoint que reciba un identificador en la URL o el cuerpo debe comprobar que ese recurso pertenece a quien lo pide — no solo que quien lo pide esté logueado. Cierra con un Account Takeover completo explotando un fallo en la confirmación de reseteo de contraseña.
Se practica en local contra tu propia instancia (127.0.0.1). Usa /reset en cualquier momento para devolver toda la base de datos a su estado inicial.
El formulario de login no sanea su entrada: una inyección clásica basta para entrar sin conocer ninguna contraseña.
Cambiando el identificador del pedido en la URL se lee el pedido de cualquier otro cliente de la tienda.
La misma falta de comprobación de propiedad, esta vez sobre los datos de perfil de otros usuarios.
El resumen de un checkout ajeno — con datos de pago y envío — se lee igual que el propio.
El paso final de confirmación del reseteo de contraseña no comprueba que el token pertenezca a la cuenta indicada.