# GraphQL Injection

## 🔍 O que é GraphQL?

**GraphQL** é uma linguagem de consulta e um runtime para APIs. Diferente do REST, onde você tem múltiplos endpoints para diferentes recursos, no GraphQL você geralmente tem um **único endpoint** (ex: `/graphql`) onde o cliente define exatamente quais dados deseja receber.

### Por que isso é um alvo?

Pela sua flexibilidade, se não for bem configurado, o GraphQL pode permitir que atacantes consultem dados sensíveis, abusem de relacionamentos entre objetos ou derrubem o servidor com consultas circulares.

***

## ⚔️ Vulnerabilidades Comuns em GraphQL

1. **Introspecção Habilitada:** Permite ao atacante baixar todo o esquema da API (queries, mutations, tipos).
2. **Falta de Autorização (BOLA/IDOR):** O GraphQL é apenas uma camada; se o resolver não verificar permissões, dados de terceiros podem ser acessados.
3. **Batching Attack:** Enviar múltiplas queries em uma única requisição para contornar rate limits de login.
4. **Query Complexity Attack:** Consultas extremamente profundas que exaurem os recursos do servidor.

***

## 🔧 Técnicas de Exploração

### 1. Ataque de Injeção de Argumentos

Similar ao SQL Injection, se os argumentos da query forem concatenados sem validação no resolver do banco de dados.

```graphql
query {
  user(id: "1' OR '1'='1") {
    username
    email
  }
}
```

### 2. Abuso de Consultas Circulares (DoS)

Se houver relacionamentos bidirecionais (ex: User tem Post, Post tem Author/User).

```graphql
query {
  user(id: 1) {
    posts {
      author {
        posts {
          author {
            # Repetir infinitamente
          }
        }
      }
    }
  }
}
```

### 3. Bypass de Autenticação via Aliases

O GraphQL permite definir aliases. Um atacante pode enviar milhares de tentativas de login em um único POST, dificultando a detecção por ferramentas de monitoramento simples.

```graphql
mutation {
  login1: login(user: "admin", pass: "123") { token }
  login2: login(user: "admin", pass: "456") { token }
  # ... repita 500 vezes
}
```

***

## 🔍 Introspecção e Reconhecimento

Se a **Introspecção** estiver ligada, você pode obter todos os detalhes da API com esta consulta:

```graphql
query {
  __schema {
    queryType { name }
    mutationType { name }
    types {
      name
      fields {
        name
        type { name kind }
      }
    }
  }
}
```

### Bypass de Introspecção Desabilitada

Alguns servidores bloqueiam a query acima, mas permitem sugestões de campo (**Field Suggestions**). Se você digitar um nome de campo quase correto, o erro retornará o nome real:

* Input: `query { system_infp }`
* Erro: `Did you mean "system_info"?` -> **Reconhecimento bem-sucedido.**

***

## 🔍 Detecção e Ferramentas

1. **InQL (Burp Suite Extension)**\
   Ajuda a visualizar o esquema do GraphQL e gera queries/mutations automaticamente para teste.
2. **GraphQL Voyager**\
   Transforma o esquema (via introspecção) em um mapa visual interativo para facilitar a identificação de caminhos para dados sensíveis.
3. **Clairvoyance**\
   Ferramenta para reconstituir o esquema de uma API GraphQL mesmo com a introspecção desabilitada, usando a técnica de Field Suggestions.

***

## 🛡️ Mitigação e Prevenção

1. **Desabilitar Introspecção em Produção**\
   Isso dificulta o mapeamento da superfície de ataque, embora não impeça ataques baseados em tentativa e erro.
2. **Implementar Limite de Profundidade (Depth Limiting)**\
   Restrinja o quão profunda uma consulta pode ser para evitar queries circulares (ex: máximo 5-10 níveis).
3. **Máximo de Complexidade (Query Cost Analysis)**\
   Atribua "pesos" a cada campo e bloqueie consultas que ultrapassem um custo total seguro.
4. **Desabilitar Consultas em Lote (Batching) Sensíveis**\
   Não permita que operações de login ou recuperação de senha sejam enviadas em lotes.
5. **Autorização no Nível do Resolver**\
   A segurança deve ser implementada no código que busca o dado (o "resolver"). Cada função que acessa um objeto no banco de dados deve validar se o usuário atual tem permissão para aquele ID específico.

{% hint style="warning" %}
O GraphQL não é inerentemente "mais inseguro" que o REST, mas ele transfere o poder de consulta para o cliente. Se o servidor não impuser limites rígidos sobre esse poder, a API se torna um parquinho de diversões para atacantes.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/tecnicas/web/back-end/apis/graphql-injection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
