mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/graphql.md']
This commit is contained in:
parent
51275867de
commit
7e4ccbe4f6
@ -41,7 +41,7 @@ Graphql generalmente soporta **GET**, **POST** (x-www-form-urlencoded) y **POST*
|
||||
|
||||
#### Introspección
|
||||
|
||||
Para usar la introspección para descubrir información del esquema, consulta el campo `__schema`. Este campo está disponible en el tipo raíz de todas las consultas.
|
||||
Para usar la introspección y descubrir información del esquema, consulta el campo `__schema`. Este campo está disponible en el tipo raíz de todas las consultas.
|
||||
```bash
|
||||
query={__schema{types{name,fields{name}}}}
|
||||
```
|
||||
@ -193,7 +193,7 @@ Puedes simplemente consultarlo con:
|
||||
query = { hiddenFlags }
|
||||
```
|
||||
En otro ejemplo donde había 2 objetos dentro del objeto de tipo "_Query_": "_user_" y "_users_".\
|
||||
Si estos objetos no necesitan ningún argumento para buscar, podría **recuperar toda la información de ellos** simplemente **pidiendo** los datos que desea. En este ejemplo de Internet podría extraer los nombres de usuario y contraseñas guardados:
|
||||
Si estos objetos no necesitan ningún argumento para buscar, podría **recuperar toda la información de ellos** simplemente **pidiendo** los datos que desea. En este ejemplo de Internet, podría extraer los nombres de usuario y contraseñas guardados:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -211,7 +211,7 @@ Así que, realizando un ligero _**uid**_ bruteforce, descubrí que en _**uid**=*
|
||||
|
||||
.png>)
|
||||
|
||||
Nota que **descubrí** que podía pedir los **parámetros** "_**user**_" y "_**password**_" porque si intento buscar algo que no existe (`query={user(uid:1){noExists}}`) obtengo este error:
|
||||
Ten en cuenta que **descubrí** que podía pedir los **parámetros** "_**user**_" y "_**password**_" porque si intento buscar algo que no existe (`query={user(uid:1){noExists}}`) obtengo este error:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -369,7 +369,7 @@ Para eludir las restricciones en las consultas de introspección en las API, ins
|
||||
```
|
||||
Si no tiene éxito, considere métodos de solicitud alternativos, como **solicitudes GET** o **POST con `x-www-form-urlencoded`**, ya que las restricciones pueden aplicarse solo a las solicitudes POST.
|
||||
|
||||
### Intente WebSockets
|
||||
### Pruebe WebSockets
|
||||
|
||||
Como se mencionó en [**esta charla**](https://www.youtube.com/watch?v=tIo_t5uUK50), verifique si podría ser posible conectarse a graphQL a través de WebSockets, ya que eso podría permitirle eludir un posible WAF y hacer que la comunicación de WebSocket filtre el esquema de graphQL:
|
||||
```javascript
|
||||
@ -417,13 +417,13 @@ Ten en cuenta que las solicitudes de GraphQL generalmente se envían a través d
|
||||
```javascript
|
||||
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
|
||||
```
|
||||
Sin embargo, la mayoría de los endpoints de GraphQL también soportan **`form-urlencoded` solicitudes POST:**
|
||||
Sin embargo, la mayoría de los endpoints de GraphQL también soportan **`form-urlencoded` POST requests:**
|
||||
```javascript
|
||||
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
```
|
||||
Por lo tanto, dado que las solicitudes CSRF como las anteriores se envían **sin solicitudes de preflight**, es posible **realizar** **cambios** en el GraphQL abusando de un CSRF.
|
||||
|
||||
Sin embargo, tenga en cuenta que el nuevo valor predeterminado de la cookie del flag `samesite` de Chrome es `Lax`. Esto significa que la cookie solo se enviará desde un sitio web de terceros en solicitudes GET.
|
||||
Sin embargo, tenga en cuenta que el nuevo valor predeterminado de la cookie de la bandera `samesite` de Chrome es `Lax`. Esto significa que la cookie solo se enviará desde un sitio web de terceros en solicitudes GET.
|
||||
|
||||
Tenga en cuenta que generalmente es posible enviar la **solicitud** **de consulta** también como una **solicitud GET y el token CSRF podría no ser validado en una solicitud GET.**
|
||||
|
||||
@ -443,7 +443,7 @@ Para más información consulte:
|
||||
|
||||
## Autorización en GraphQL
|
||||
|
||||
Muchas funciones de GraphQL definidas en el endpoint pueden solo verificar la autenticación del solicitante pero no la autorización.
|
||||
Muchas funciones de GraphQL definidas en el endpoint podrían solo verificar la autenticación del solicitante pero no la autorización.
|
||||
|
||||
Modificar las variables de entrada de la consulta podría llevar a detalles sensibles de la cuenta [filtrados](https://hackerone.com/reports/792927).
|
||||
|
||||
@ -459,13 +459,13 @@ La mutación podría incluso llevar a la toma de control de la cuenta al intenta
|
||||
|
||||
[Encadenar consultas](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) juntas puede eludir un sistema de autenticación débil.
|
||||
|
||||
En el ejemplo a continuación, puedes ver que la operación es "forgotPassword" y que solo debería ejecutar la consulta forgotPassword asociada. Esto se puede eludir añadiendo una consulta al final; en este caso, añadimos "register" y una variable de usuario para que el sistema registre a un nuevo usuario.
|
||||
En el ejemplo a continuación, puedes ver que la operación es "forgotPassword" y que solo debería ejecutar la consulta forgotPassword asociada. Esto se puede eludir agregando una consulta al final; en este caso, agregamos "register" y una variable de usuario para que el sistema registre a un nuevo usuario.
|
||||
|
||||
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Eludir límites de tasa usando alias en GraphQL
|
||||
|
||||
En GraphQL, los alias son una característica poderosa que permite la **nominación de propiedades explícitamente** al hacer una solicitud API. Esta capacidad es particularmente útil para recuperar **múltiples instancias del mismo tipo** de objeto dentro de una sola solicitud. Los alias se pueden emplear para superar la limitación que impide que los objetos de GraphQL tengan múltiples propiedades con el mismo nombre.
|
||||
En GraphQL, los alias son una característica poderosa que permite **nombrar propiedades explícitamente** al hacer una solicitud API. Esta capacidad es particularmente útil para recuperar **múltiples instancias del mismo tipo** de objeto dentro de una sola solicitud. Los alias se pueden emplear para superar la limitación que impide que los objetos de GraphQL tengan múltiples propiedades con el mismo nombre.
|
||||
|
||||
Para una comprensión detallada de los alias de GraphQL, se recomienda el siguiente recurso: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
|
||||
@ -521,7 +521,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
-d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
Tenga en cuenta que en el ejemplo anterior `@aa` es una directiva personalizada que **puede no estar declarada**. Una directiva común que suele existir es **`@include`**:
|
||||
Tenga en cuenta que en el ejemplo anterior `@aa` es una directiva personalizada que **puede no estar declarada**. Una directiva común que generalmente existe es **`@include`**:
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
|
Loading…
x
Reference in New Issue
Block a user