* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
GraphQL atua como uma alternativa à API REST. As APIs REST exigem que o cliente envie várias solicitações a diferentes pontos de extremidade na API para consultar dados do banco de dados do backend. Com o GraphQL, você só precisa enviar uma solicitação para consultar o backend. Isso é muito mais simples porque você não precisa enviar várias solicitações à API, uma única solicitação pode ser usada para coletar todas as informações necessárias.
À medida que novas tecnologias surgem, novas vulnerabilidades também surgem. Por **padrão**, o GraphQL **não** implementa **autenticação**, isso é responsabilidade do desenvolvedor implementar. Isso significa que, por padrão, o GraphQL permite que qualquer pessoa o consulte, e qualquer informação confidencial estará disponível para atacantes não autenticados.
Depois de encontrar uma instância aberta do 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 perguntar a um esquema GraphQL informações sobre quais consultas ele suporta. O GraphQL nos permite fazer isso…](https://graphql.org/learn/introspection/)
A ferramenta [**graphw00f**](https://github.com/dolevf/graphw00f) é capaz de detectar qual mecanismo GraphQL é usado em um servidor e, em seguida, imprime algumas informações úteis para o auditor de segurança.
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.
A introspecção é uma técnica que permite obter informações sobre a estrutura do banco de dados GraphQL. Isso pode ser útil para um atacante, pois permite que ele entenda melhor como os dados estão organizados e quais informações podem ser acessadas.
Existem várias ferramentas que podem ser usadas para realizar a introspecção, como o GraphiQL e o GraphQL Playground. Essas ferramentas permitem que o atacante envie consultas GraphQL para o servidor e receba informações sobre o esquema do banco de dados em resposta.
Uma vez que o atacante tenha obtido informações sobre o esquema do banco de dados, ele pode usar essas informações para construir consultas GraphQL personalizadas que permitam acessar informações confidenciais ou realizar outras atividades maliciosas.
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 **nome** e **valor**. Então, você pode obter todos os nomes e valores das flags com a consulta:
Em outro exemplo em que havia 2 objetos dentro do objeto "_Query_": "_user_" e "_users_".\
Se esses objetos não precisam de nenhum argumento para pesquisar, você pode **recuperar todas as informações deles** apenas **pedindo** pelos 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 irá pesquisar usando o argumento "_**uid**_" do tipo _**Int**_.\
De qualquer forma, já sabíamos disso, na seção [Enumeração Básica](graphql.md#enumeração-básica) foi proposta uma consulta 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}}}}}}}`
Observe que eu **descobri** que poderia pedir pelos **parâmetros** "_**user**_" e "_**password**_" porque se eu tentar procurar por algo que não existe (`query={user(uid:1){noExists}}`) recebo este erro:
Se você pode pesquisar por um tipo de string, como: `query={theusers(description: ""){username,password}}` e você **procura por uma string vazia**, ele irá **despejar todos os dados**. (_Observe que este exemplo não está relacionado com o exemplo dos tutoriais, para este exemplo suponha que você possa pesquisar usando "**theusers**" por um campo String chamado "**description**"_).
GraphQL é uma tecnologia relativamente nova que está começando a ganhar força entre startups e grandes corporações. Além de faltar autenticação por padrão, os endpoints do graphQL podem ser vulneráveis a outros bugs, como IDOR.
Para este exemplo, imagine um banco de dados com **pessoas** identificadas pelo e-mail e pelo nome e **filmes** identificados pelo nome e pela classificação. Uma **pessoa** pode ser **amiga** de outras **pessoas** e uma pessoa pode **ter filmes**.
Na **introspecção** você pode encontrar as **mutações****declaradas**. Na imagem a seguir, o "_MutationType_" é chamado de "_Mutation_" e o objeto "_Mutation_" contém os nomes das mutações (como "_addPerson_" neste caso):
Para este exemplo, imagine um banco de dados com **pessoas** identificadas pelo e-mail 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 **mutação** para **criar****pessoas** (chamada `addPerson` neste exemplo) com amigos e arquivos (observe 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 diferentes credenciais** para verificá-las. É um ataque de força bruta clássico, mas agora é possível enviar mais de um par de login/senha por requisição HTTP por causa do recurso de agrupamento do GraphQL. Essa abordagem enganaria aplicativos externos de monitoramento de taxa, fazendo-os pensar que tudo está bem e que não há um robô de força bruta 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 uma só 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 as informações correspondentes na seção _error_. A **segunda mutação teve os dados de autenticação corretos** e a resposta tem o token de sessão de autenticação correto.
Cada vez mais, **os pontos finais do 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 que ferramentas como [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) possam recriar a maior parte do esquema.
Além disso, a extensão do Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **observa as solicitações da API GraphQL que passam pelo Burp** e **constrói** um **esquema** interno do GraphQL com cada nova consulta que vê. Ele 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 isso**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Portanto, como as solicitações CSRF como as anteriores são enviadas **sem solicitações de pré-voo**, é possível **realizar****alterações** no GraphQL abusando de um CSRF.
No entanto, observe que o novo valor padrão do cookie da flag `samesite` do Chrome é `Lax`. Isso significa que o cookie só será enviado por um site de terceiros em solicitações GET.
Observe também 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, abusando de um [ataque **XS-Search**](../../pentesting-web/xs-search.md), pode ser possível extrair conteúdo do endpoint GraphQL abusando das credenciais do usuário.
A modificação das variáveis de entrada da consulta pode levar à **exposição** de detalhes da conta confidenciais [vazados](https://hackerone.com/reports/792927).
No exemplo abaixo, você pode ver que a operação é "forgotPassword" e que ela só deve executar a consulta forgotPassword associada a ela. Isso pode ser burlado adicionando uma consulta ao final, neste caso adicionamos "register" e uma variável de usuário para o sistema se registrar como um novo usuário.
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 poderosas sobre o esquema e o uso de cada objeto e função. A guia `Sources` das ferramentas do desenvolvedor pode pesquisar todos os arquivos para enumerar onde as consultas são salvas. Às vezes, até mesmo as consultas protegidas pelo administrador já estão expostas.
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Conjunto de ferramentas que pode ser usado para obter esquemas e procurar dados sensíveis, testar autorização, forçar 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 um aplicativo independente ou [extensão do 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.
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).