GraphQL
O GraphQL não é um banco de dados (apesar do nome lembrar bastante algo como SQL), mas ele nos oferece uma boa maneira de obter metadados sobre as informações disponíveis (semelhante à tabela information_schema
do MySQL). Podemos por exemplo, saber o que está disponível. Isso pode causar um risco à segurança, pois invasores podem conseguir acesso a informações que não poderiam ser expostas (segurança por obscuridade).
Localizando o GraphQL
Geralmente o GraphQL está em algum subdomínio, como graphql.site.com
, ou em subdiretórios como site.com/graphql
, site.com/graphql.php
, site.com/graphiql
(versão GUI) e site.com/graphql/console
.
Instrospection
Ativo
É sempre útil solicitar informações a um esquema GraphQL para saber quais consultas ele suporta e podemos fazer isso através do Introspection. Para a alegria do atacante, o Instrospection já vem habilitado por padrão no GraphQL. Segue abaixo algumas queries possíveis de fazer quando o Instrospect está ativo:
Consultando os tipos de dados disponíveis
Descobrindo um bom lugar para começar a explorar quais consultas estão disponíveis. Quando projetamos nosso sistema de tipos, especificamos em que tipo todas as consultas começariam.
Com a consulta abaixo, podemos extrair todos os tipos, seus campos e seus argumentos (e o tipo dos args). Isso será muito útil para saber como consultar o banco de dados.
Uma boa forma também de trazermos todos os dados necessários, é utilizando o payload com URL Encode, da seguinte forma.
Inativo
É cada vez menos comum acharmos GraphQL com Instrospection ativo, mas isso não nos empede de mapearmos as suas informações. Para isso, podemos contar com o Clairvoyance
para nos ajudar nessa missão.
Mutations
As Mutation podem ser utilizadas para inserir dados. Note que abaixo estamos inserindo algumas informações entre parentes e depois estamos passando alguns campos entre chaves, que servem pra informar ao GraphQL o que ele devolver de informação após a inserção. Então inserimos nome e ano, porém só irá ser retornado o nome ao realizar a inserção.
Fragments
Os Fragments, são utilizado para evitar que uma query tenha uma escrita repetitiva, servindo assim como uma espécia de função/método. Abaixo um exemplo de utilização de Fragment, para tratar duas chamadas de pesquisas de usuário.
Mensagens de Erro
Mensagens de erro também podem nos dar boas dicas de uso, entre informações que também podem ser importantes. Abaixo segue algumas queries que podem provocar boas mensagens de erro.
GraphQL Voyager
Ferrementa offline e online (link no final da página) que recebe o resultado de uma query contra um GraphQL com Instrospection ativo e a partir desse resultado, realiza uma demonstação gráfica sobre a estrutura do alvo.
O primeiro passo para isso, é confirmar que o cliente possui o Instrospection ativo e, então, utilizar a seguinte query:
Copie o resultado da query, vá no GraphQL Voyager, clique em Change Schema
, vá na aba Instrospection
, cole o resultado e clique em Display
.
Graphqlmap
Sites
Last updated