Translated ['src/network-services-pentesting/pentesting-web/graphql.md']

This commit is contained in:
Translator 2025-01-22 23:11:59 +00:00
parent 51275867de
commit 7e4ccbe4f6

View File

@ -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:
![](<../../images/image (880).png>)
@ -211,7 +211,7 @@ Así que, realizando un ligero _**uid**_ bruteforce, descubrí que en _**uid**=*
![](<../../images/image (90).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:
![](<../../images/image (707).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" \