Pruebas de penetración de GraphQL

February 21, 2022
Pentestes

L; SECAR

Pase a la sección de casos de prueba de seguridad si es un pentester experimentado.

¿Qué es GraphQL?

GraphQL es un lenguaje de consulta de API basado en el muestreo de datos declarativo, es decir, el cliente puede especificar exactamente qué datos necesita de la API. En lugar de varios puntos finales de API (REST), GraphQL representa un único punto final que proporciona al cliente los datos solicitados.

Por lo general, en la API REST, necesitas obtener información de diferentes puntos finales. En GraphQL, para obtener los mismos datos, debes realizar una consulta que indique los datos que deseas recibir. Hay 3 tipos principales de consultas en GraphQL:

  • Consulta
  • Mutación
  • Descripción

Este es un ejemplo de solicitud HTTP para un punto final de GraphQL.

POST /graphql HTTP/1.1

Anfitrión: example.com

Aceptar: application/json, text/plain, */*

Idioma de aceptación: en-US, en; q=0.5

Aceptar codificación: gzip, deflate

<TRUNCATED>Autorización: Portador << >>

Tipo de contenido: application/json

Longitud del contenido: 488

Origen: https://www.example.com

Conexión: cerrar

<TRUNCATED BODY><< >>

Casos de prueba de seguridad

Consulta de introspección

La introspección se usa para solicitar un esquema de GraphQL para obtener información sobre qué consultas, tipos, etc. admite. La información sobre las consultas, las mutaciones, los tipos, etc. proporcionaría al atacante muchas oportunidades para encontrar vulnerabilidades y errores en el procesamiento de una implementación específica de GraphQL.

Está habilitada de forma predeterminada y el desarrollador debe deshabilitarla o restringirla. Este es un buen enlace sobre cómo deshabilitar la introspección en varios lenguajes de programación: https://lab.wallarm.com/why-and-how-to-disable-introspection-query-for-graphql-apis/

La herramienta para probar la consulta de introspección es iNQL, disponible como extensión Burp o línea de comandos.

https://github.com/doyensec/inql

Este es el aspecto de la solicitud HTTP de consulta de introspección:

POST /graphql HTTP/1.1

Anfitrión: example.com

Aceptar: application/json, text/plain, */*

Idioma de aceptación: en-US, en; q=0.5

Aceptar codificación: gzip, deflate

Tipo de contenido: application/json

Longitud del contenido: 746

Origen: https://example.com

Conexión: cerrar

Referente: https://example.com

{"query»: «query IntrospectionQuery {__schema {QueryType {name} MutationType {name} subscriptionType {name} types {... fullType} directivas {... inputValue}}} fragmento FullType on __Type {kind name descripción campos (includeDeprecated:true) {name description args {... inputValue} type {... typeRef} isDeprecated:true) {name description args {... inputValue} type {... typeRef} isDeprecated:true DeprecationReason} InputFields {... inputValue} interfaces {... typeRef} enumValues (includeDeprecated:true) {name description IsDeprecationReason} PossibleTypes {... typeRef}} fragmento InputValue en __inputValue {name description type {... typeRef} DefaultValue} fragmento TypeRef en __Type {nombre del tipo {nombre del tipo {nombre del tipo {nombre del tipo {nombre del tipo {nombre del tipo {nombre del tipo {nombre del tipo}}}}}}}} "}

La solicitud HTTP anterior (cuando se reemplaza por puntos finales reales de GraphQL) le proporcionaría consultas, mutaciones, suscripciones y argumentos si la consulta de introspección está habilitada.

Fuga de información

Existe una alta probabilidad de que el punto final de GraphQL arroje un error detallado al usuario final. La forma más fácil y rápida de activar un mensaje de error es insertar una carga maliciosa como ', «,; en la consulta de GraphQL. Este es el ejemplo.

POST /graphql HTTP/1.1

Anfitrión: example.com

Aceptar: application/json, text/plain, */*

Idioma de aceptación: en-US, en; q=0.5

Aceptar codificación: gzip, deflate

Tipo de contenido: application/json

Longitud del contenido: 746

Origen: https://example.com

Conexión: cerrar

Referente: https://example.com

{"operationName» :null, "variables»: {"searchStringValue» :"example' "}, "query» :"query ($searchStringValue: String!) <TRUNCATED><< >> "}

Inyecciones

GraphQL es solo una capa entre las aplicaciones cliente y la base de datos que la hace susceptible a los ataques de inyección. Recomendamos realizar esta prueba manualmente o usar Burp Intruder (con la extensión Logger++) insertando cargas útiles de inyección de SQL en la consulta de GraphQL. La herramienta SQLmap puede realizar una explotación adicional.

Terminales comunes de GraphQL

A continuación se muestran los puntos finales comunes a los que debe intentar acceder durante la prueba de penetración.

  • /gráfico/
  • /graphql/consola/
  • /graphql.php
  • /gráfico/
  • /graphiql.php
  • /graphql.php? debug=1

Además, ejecute un escáner de servidor web específico, como Nikto, para identificar cualquier problema obvio.

Controles de acceso rotos

Esta es una vulnerabilidad interesante si el punto final usa un identificador secuencial o un nombre de rol de usuario predecible, como administrador, revisor, auditor, etc. Podría intentar manipular los valores para evaluar la implementación del control de acceso dentro de la aplicación.


Herramientas

Esta es la lista de herramientas útiles para la evaluación.

  • Suite Burp
  • Extensión iNQL Burp
  • Habilidades de prueba de penetración manual..:)

Puede ponerse en contacto con nosotros en hello@security-simplified.com para cualquier duda o sugerencia.

¡¡¡Feliz hackeo!!!

Share this post
Seguridad de Wordpress
Análisis de malware
Herramientas y técnicas
Pentestes
PTAAS
Suscríbase a nuestro boletín

Suscríbase a nuestro boletín hoy mismo y mejore sus conocimientos con información valiosa. ¡Es rápido, fácil y gratuito!

Be a Team Player
¡Gracias! ¡Su presentación ha sido recibida!
¡Uy! Algo salió mal al enviar el formulario.
Latest blogs

Latest updates in cybersecurity services

View All
Blacklock Blog Image