<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
GraphQL atua como uma alternativa à API REST. APIs REST exigem que o cliente envie múltiplas requisições para diferentes endpoints na API para consultar dados do banco de dados backend. Com GraphQL, você só precisa enviar uma requisição para consultar o backend. Isso é muito mais simples porque você não precisa enviar múltiplas requisições para a API, uma única requisição pode ser usada para reunir todas as informações necessárias.
À medida que novas tecnologias surgem, novas vulnerabilidades também aparecem. Por **padrão**, o GraphQL **não** implementa **autenticação**, isso fica a cargo do desenvolvedor implementar. Isso significa que, por padrão, o GraphQL permite que qualquer um o consulte, e qualquer informação sensível estará disponível para atacantes não autenticados.
Ao realizar seus ataques de força bruta em diretórios, certifique-se de adicionar os seguintes caminhos para verificar a existência de instâncias GraphQL.
Uma vez que você encontre uma instância aberta de GraphQL, você precisa saber **quais consultas ela suporta**. Isso pode ser feito usando o sistema de introspecção, mais detalhes podem ser encontrados aqui: [**GraphQL: Uma linguagem de consulta para APIs.**\
É frequentemente útil pedir a um esquema GraphQL informações sobre quais consultas ele suporta. GraphQL nos permite fazer isso…](https://graphql.org/learn/introspection/)
A ferramenta [**graphw00f**](https://github.com/dolevf/graphw00f) é capaz de detectar qual motor GraphQL é usado em um servidor e, em seguida, imprime algumas informações úteis para o auditor de segurança.
Se você enviar `query{__typename}` para qualquer endpoint GraphQL, ele incluirá a string `{"data": {"__typename": "query"}}` em algum lugar em sua resposta. Isso é conhecido como uma consulta universal e é uma ferramenta útil para sondar se uma URL corresponde a um serviço GraphQL.
GraphQL geralmente suporta **GET**, **POST** (x-www-form-urlencoded) e **POST**(json). Embora, por segurança, seja recomendado permitir apenas json para prevenir ataques CSRF.
Para usar a introspecção para descobrir informações do esquema, consulte o campo `__schema`. Este campo está disponível no tipo raiz de todas as consultas.
Com esta consulta, você pode extrair todos os tipos, seus campos e seus argumentos (e o tipo dos argumentos). Isso será muito útil para saber como consultar o banco de dados.
Se a introspecção estiver ativada, mas a consulta acima não funcionar, tente remover as diretivas `onOperation`, `onFragment` e `onField` da estrutura da consulta.
Se a introspecção estiver habilitada, você pode usar o [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) para visualizar em uma GUI todas as opções.
Na introspecção, você pode encontrar **qual objeto você pode consultar diretamente** (porque você não pode consultar um objeto apenas porque ele existe). Na imagem a seguir, você pode ver que o "_queryType_" é chamado "_Query_" e que um dos campos do objeto "_Query_" é "_flags_", que também é um tipo de objeto. Portanto, você pode consultar o objeto flag.
Você pode ver que os objetos "_Flags_" são compostos por **name** e **value**. Então você pode obter todos os nomes e valores das flags com a consulta:
Em outro exemplo onde havia 2 objetos dentro do objeto "_Query_": "_user_" e "_users_".\
Se esses objetos não precisarem de nenhum argumento para buscar, poderiam **recuperar todas as informações deles** apenas **solicitando** os dados que você quer. Neste exemplo da Internet, você poderia extrair os nomes de usuário e senhas salvos:
Parece que de alguma forma ele vai buscar usando o argumento "_**uid**_" do tipo _**Int**_.\
De qualquer forma, já sabíamos disso, na seção [Enumeração Básica](graphql.md#basic-enumeration) uma consulta foi proposta que estava nos mostrando todas as informações necessárias: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Note que eu **descobri** que eu poderia pedir pelos **parâmetros** "_**user**_" e "_**password**_" porque se eu tentar procurar por algo que não existe (`query={user(uid:1){noExists}}`) eu recebo este erro:
Se você pode buscar por um tipo de string, como: `query={theusers(description: ""){username,password}}` e você **procura por uma string vazia** isso irá **despejar todos os dados**. (_Note que este exemplo não está relacionado com o exemplo dos tutoriais, para este exemplo suponha que você pode buscar usando "**theusers**" por um campo String chamado "**description**"_).
GraphQL é uma tecnologia relativamente nova que está começando a ganhar alguma tração entre startups e grandes corporações. Além da falta de autenticação por padrão, endpoints GraphQL podem ser vulneráveis a outros bugs, como IDOR.
Para este exemplo, imagine um banco de dados com **pessoas** identificadas pelo email e pelo nome e **filmes** identificados pelo nome e classificação. Uma **pessoa** pode ser **amiga** de outras **pessoas** e uma pessoa pode **ter filmes**.
Na **introspecção**, você pode encontrar as **mutations****declaradas**. Na imagem a seguir, o "_MutationType_" é chamado de "_Mutation_" e o objeto "_Mutation_" contém os nomes das mutations (como "_addPerson_" neste caso):
Para este exemplo, imagine um banco de dados com **pessoas** identificadas pelo email e nome e **filmes** identificados pelo nome e classificação. Uma **pessoa** pode ser **amiga** de outras **pessoas** e uma pessoa pode **ter filmes**.
Também pode haver uma **mutation** para **criar****pessoas** (chamada `addPerson` neste exemplo) com amigos e filmes (note que os amigos e filmes devem existir antes de criar uma pessoa relacionada a eles):
Esta informação foi retirada de [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Autenticação através da API GraphQL com **envio simultâneo de muitas consultas com credenciais diferentes** para verificação. É um ataque de força bruta clássico, mas agora é possível enviar mais de um par de login/senha por requisição HTTP devido ao recurso de lote do GraphQL. Esta abordagem enganaria aplicativos de monitoramento de taxa externa, fazendo-os pensar que está tudo bem e que não há um bot tentando adivinhar senhas.
Abaixo, você pode encontrar a demonstração mais simples de uma solicitação de autenticação de aplicativo, com **3 pares de email/senha diferentes de cada vez**. Obviamente, é possível enviar milhares em uma única solicitação da mesma maneira:
Como podemos ver na captura de tela da resposta, as primeiras e terceiras solicitações retornaram _null_ e refletiram a informação correspondente na seção _error_. A **segunda mutação tinha os dados de autenticação corretos** e a resposta tem o token de sessão de autenticação correto.
Cada vez mais **endpoints graphql estão desativando a introspecção**. No entanto, os erros que o graphql gera quando recebe uma solicitação inesperada são suficientes para ferramentas como [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) recriarem a maior parte do esquema.
Além disso, a extensão Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **observa as solicitações da API GraphQL passando pelo Burp** e **constrói** um esquema GraphQL interno com cada nova consulta que vê. Também pode expor o esquema para GraphiQL e Voyager. A extensão retorna uma resposta falsa quando recebe uma consulta de introspecção. Como resultado, o GraphQuail mostra todas as consultas, argumentos e campos disponíveis para uso dentro da API. Para mais informações [**verifique isto**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Uma boa **lista de palavras** para descobrir [**entidades GraphQL pode ser encontrada aqui**](https://github.com/Escape-Technologies/graphql-wordlist?).
Se você não conseguir executar consultas de introspecção para a API que está testando, tente inserir um **caractere especial após a palavra-chave `__schema`**.
Quando os desenvolvedores desativam a introspecção, eles podem usar uma regex para excluir a palavra-chave `__schema` nas consultas. Você deve tentar caracteres como **espaços**, **novas linhas** e **vírgulas**, pois são **ignorados** pelo GraphQL, mas não por regex com falhas.
Se isso não funcionar, tente executar a sonda usando um método de solicitação alternativo, pois a introspecção pode estar desativada apenas para POST. Tente uma solicitação GET ou uma solicitação POST com um content-type de `x-www-form-urlencoded`.
Se a introspecção estiver desativada, tente olhar o código-fonte do site. As consultas geralmente são pré-carregadas no navegador como bibliotecas javascript. Essas consultas pré-escritas podem revelar informações valiosas sobre o esquema e o uso de cada objeto e função. A aba `Sources` das ferramentas de desenvolvedor pode pesquisar todos os arquivos para enumerar onde as consultas estão salvas. Às vezes, até as consultas protegidas pelo administrador já estão expostas.
Portanto, como as solicitações CSRF, como as anteriores, são enviadas **sem solicitações de preflight**, é possível **realizar****alterações** no GraphQL abusando de um CSRF.
No entanto, observe que o novo valor padrão do cookie para a flag `samesite` do Chrome é `Lax`. Isso significa que o cookie só será enviado de um site terceiro em solicitações GET.
Note que geralmente é possível enviar a **solicitação de consulta** também como uma **solicitação GET e o token CSRF pode não ser validado em uma solicitação GET.**
Além disso, abusar de um **ataque** [**XS-Search**](../../pentesting-web/xs-search.md) pode ser possível exfiltrar conteúdo do endpoint GraphQL abusando das credenciais do usuário.
[Encadeamento de consultas](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) pode contornar um sistema de autenticação fraco.
No exemplo abaixo, você pode ver que a operação é "forgotPassword" e que ela deveria executar apenas a consulta forgotPassword associada a ela. Isso pode ser contornado adicionando uma consulta ao final, neste caso adicionamos "register" e uma variável de usuário para o sistema registrar como um novo usuário.
Normalmente, objetos GraphQL não podem conter múltiplas propriedades com o mesmo nome. Aliases permitem que você contorne essa restrição **nomeando explicitamente as propriedades que deseja** que a API retorne. Você pode usar aliases para retornar **múltiplas instâncias do mesmo** tipo de objeto em uma única solicitação.
Embora os aliases sejam destinados a limitar o número de chamadas de API que você precisa fazer, eles também podem ser usados para força bruta em um endpoint GraphQL.
Muitos endpoints terão algum tipo de **limitador de taxa para prevenir ataques de força bruta**. Alguns limitadores de taxa funcionam com base no **número de solicitações HTTP** recebidas em vez do número de operações realizadas no endpoint. Como aliases efetivamente permitem enviar múltiplas consultas em uma única mensagem HTTP, eles podem contornar essa restrição.
O exemplo simplificado abaixo mostra uma série de **consultas com aliases verificando se códigos de desconto de lojas são válidos**. Esta operação poderia potencialmente contornar o limite de taxa, pois é uma única solicitação HTTP, mesmo que possa ser usada para verificar um grande número de códigos de desconto de uma só vez.
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Toolkit que pode ser usado para capturar esquemas e procurar por dados sensíveis, testar autorização, força bruta em esquemas e encontrar caminhos para um determinado tipo.
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Pode ser usado como standalone ou [extensão Burp](https://github.com/doyensec/inql).
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Pode ser usado como um cliente CLI também para automatizar ataques.
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Ferramenta que lista as diferentes maneiras de alcançar um determinado tipo em um esquema GraphQL.
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Extensão Burp para testes avançados em GraphQL. O _**Scanner**_ é o núcleo do InQL v5.0, onde você pode analisar um endpoint GraphQL ou um arquivo de esquema de introspecção local. Ele gera automaticamente todas as possíveis queries e mutations, organizando-as em uma visão estruturada para sua análise. O componente _**Attacker**_ permite executar ataques GraphQL em lote, o que pode ser útil para contornar limites de taxa mal implementados.
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.