
Descripción
The user management functions for this lab are powered by a hidden GraphQL endpoint. You won’t be able to find this endpoint by simply clicking pages in the site. The endpoint also has some defenses against introspection.
To solve the lab, find the hidden endpoint and delete carlos
.
Learn more about Working with GraphQL in Burp Suite.
Finding a hidden GraphQL endpoint writeup
Nos encontraremos en el laboratorio con una tienda online:

Después de interactuar con todas las páginas de la aplicación web, no encontraremos el en ‘Logger’ ningún rastro de una API, por lo que tomaremos la lista que nos ha dado Portswigger de posibles nombres de API y realizaremos un ataque de fuerza bruta a la aplicación.
La lista de posibles nombres para endpoints es la siguiente:
- /graphql
- /api
- /api/graphql
- /graphql/api
- /graphql/graphql
- /graphql/v1
- /api/v1
- /api/graphql/v1
- /graphql/api/v1
- /graphql/graphql/v1
Para realizar este ataque, tomaremos una petición cualquiera, por ejemplo la de POST a la URL login y la mandaremos al Intruder con Ctrl + I o Click derecho -> Send to Intruder. Allí realizamos los siguientes cambios:

Seleccionamos ‘/login’ para que sea sustituido con ‘Add S’, después en ‘Payload’ usaremos la siguiente configuración:

Pegaremos en la lista todas las posibles URLs y desmarcaremos la opción de ‘URL-encode these characters’, dado que ya los estamos proporcionando en formato de URL.
Al finalizar el ataque encontraremos un código 405, lo cual indica que el método HTTP no está permitido:

Esto quiere decir que hay un endpoint habilitado en esta ruta, pero que no hemos interactuado correctamente con él. Enviamos esta petición al Repeater con Ctrl + R o Click derecho -> Send to Repeater para poder modificarla.

Tendremos que cambiar el método de POST a GET. Al hacerlo nos dará el siguiente mensaje:

«Query not present». Vamos a modificar la petición para añadir una query de GraphQL:
?query=query{__typename}

Ahora que lo hemos encontrado, el plugin de ‘inQL – GraphQL Scanner’ nos dejará interactuar directamente con la API. Si entramos en ‘GraphQL’, damos Click derecho -> GraphQL -> Set introspection query, nos dará el siguiente error:

Sobrepasar esta defensa será tan sencillo como añadir un salto de línea detrás de ‘__schema’:

Iremos a ‘http://nathanrandal.com/graphql-visualizer/‘ y pegaremos toda la petición (eliminando el encabezado HTTP). Nos dará el siguiente método:

Para hacer esto automáticamente volveremos al ‘Repeater’ y allí daremos Click derecho en ‘Response’ de GraphQL -> GraphQL -> Save GraphQL queries to site map. Nos iremos a ‘Target’ y encontraremos lo sigueinte:

Enviaremos la segunda al ‘Repeater’ y allí cambiaremos el ‘id’ hasta que encontremos al usuario ‘carlos’:

Nota: Si sale un error «Body cannot be empty» es porque hay que borrar de la petición ‘Content-Type: application/json; charset=utf-8’.
Ahora enviaremos la primera query que hay en ‘Target’ al ‘Repeater’, cambiaremos el ‘id’ por 3 y si sale el mismo error lo resolveremos como antes:

Al volver a la página habremos completado el laboratorio:
