mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-28 07:31:10 +00:00
Translated ['network-services-pentesting/pentesting-web/graphql.md'] to
This commit is contained in:
parent
8b620206ef
commit
97720352d1
1 changed files with 12 additions and 14 deletions
|
@ -14,11 +14,11 @@
|
|||
|
||||
## Introdução
|
||||
|
||||
O GraphQL atua como uma alternativa à API REST. As APIs REST exigem que o cliente envie várias solicitações para endpoints diferentes 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 para a API, uma única solicitação pode ser usada para reunir todas as informações necessárias.
|
||||
GraphQL atua como uma alternativa à API REST. As APIs REST exigem que o cliente envie várias solicitações para diferentes endpoints 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 para a API, uma única solicitação pode ser usada para reunir todas as informações necessárias.
|
||||
|
||||
## GraphQL
|
||||
|
||||
À medida que novas tecnologias surgem, novas vulnerabilidades também surgirão. 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 pessoa o consulte, qualquer informação sensível estará disponível para atacantes não autenticados.
|
||||
À medida que surgem novas tecnologias, surgirão novas vulnerabilidades. 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 pessoa o consulte, qualquer informação sensível estará disponível para atacantes não autenticados.
|
||||
|
||||
Ao realizar seus ataques de força bruta de diretório, certifique-se de adicionar os seguintes caminhos para verificar as instâncias do GraphQL.
|
||||
|
||||
|
@ -38,13 +38,13 @@ Uma vez que você encontre uma instância aberta do GraphQL, você precisa saber
|
|||
|
||||
### Fingerprint
|
||||
|
||||
A ferramenta [**graphw00f**](https://github.com/dolevf/graphw00f) é capaz de detectar qual mecanismo do GraphQL é usado em um servidor e, em seguida, imprime algumas informações úteis para o auditor de segurança.
|
||||
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.
|
||||
|
||||
#### Consultas universais <a href="#universal-queries" id="universal-queries"></a>
|
||||
|
||||
Se você enviar `query{__typename}` para qualquer endpoint do GraphQL, ele incluirá a string `{"data": {"__typename": "query"}}` em algum lugar de sua resposta. Isso é conhecido como uma consulta universal e é uma ferramenta útil para sondar se uma URL corresponde a um serviço GraphQL.
|
||||
|
||||
A consulta funciona porque todo endpoint do GraphQL tem um campo reservado chamado `__typename` que retorna o tipo do objeto consultado como uma string.
|
||||
A consulta funciona porque todo endpoint do GraphQL possui um campo reservado chamado `__typename` que retorna o tipo do objeto consultado como uma string.
|
||||
|
||||
### Enumeração básica
|
||||
|
||||
|
@ -194,10 +194,6 @@ Consulta de introspecção em linha:
|
|||
kind
|
||||
}
|
||||
}
|
||||
type {
|
||||
name
|
||||
kind
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -387,17 +383,19 @@ Abaixo você pode encontrar a demonstração mais simples de uma solicitação d
|
|||
|
||||
![](<../../.gitbook/assets/image (182) (1).png>)
|
||||
|
||||
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 de _error_. A **segunda mutação tinha os dados de autenticação corretos** e a resposta continha o token de sessão de autenticação correto.
|
||||
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 de _error_. A **segunda mutação teve a autenticação correta** e a resposta possui o token de sessão de autenticação correto.
|
||||
|
||||
![](<../../.gitbook/assets/image (119) (1).png>)
|
||||
|
||||
## GraphQL sem Introspecção
|
||||
|
||||
Cada vez mais, **os pontos de extremidade do GraphQL estão desabilitando 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.
|
||||
Cada vez mais, **os pontos de extremidade do GraphQL estão desabilitando a introspecção**. No entanto, os erros que o GraphQL gera quando uma solicitação inesperada é recebida 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 ele encontra. 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 na API. Para mais informações, [**verifique isso**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
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 ele 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 na API. Para mais informações, [**verifique isso**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
|
||||
### Bypassando as defesas de introspecção do GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||
Uma boa **lista de palavras** para descobrir [**entidades do GraphQL pode ser encontrada aqui**](https://github.com/Escape-Technologies/graphql-wordlist?).
|
||||
|
||||
### Bypassing defesas de introspecção do GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||
|
||||
Se você não consegue executar consultas de introspecção na API que está testando, tente inserir um **caractere especial após a palavra-chave `__schema`**.
|
||||
|
||||
|
@ -467,7 +465,7 @@ A mutação pode até levar à **assunção de conta** tentando modificar dados
|
|||
|
||||
[Encadeando consultas](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) é possível contornar um sistema de autenticação fraco.
|
||||
|
||||
No exemplo abaixo, podemos ver que a operação é "forgotPassword" e que ela deve 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.
|
||||
No exemplo abaixo, podemos ver que a operação é "forgotPassword" e que ela deve 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.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -481,7 +479,7 @@ Embora os aliases sejam destinados a limitar o número de chamadas de API que vo
|
|||
|
||||
Muitos pontos de extremidade terão algum tipo de **limitador de taxa para evitar 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 ponto de extremidade. Como os aliases permitem efetivamente enviar várias 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 os códigos de desconto da loja são válidos**. Essa operação pode 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.
|
||||
O exemplo simplificado abaixo mostra uma série de **consultas com aliases verificando se os códigos de desconto da loja são válidos**. Essa operação pode potencialmente contornar o limite de taxa, pois é uma única solicitação HTTP, mesmo que possa ser usada para verificar uma grande quantidade de códigos de desconto de uma só vez.
|
||||
```bash
|
||||
#Request with aliased queries
|
||||
query isValidDiscount($code: Int) {
|
||||
|
|
Loading…
Reference in a new issue