Pase a la sección de casos de prueba de seguridad si es un pentester experimentado.
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:
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
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.
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><< >> "}
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.
Además, ejecute un escáner de servidor web específico, como Nikto, para identificar cualquier problema obvio.
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.
Esta es la lista de herramientas útiles para la evaluación.
Puede ponerse en contacto con nosotros en hello@security-simplified.com para cualquier duda o sugerencia.
¡¡¡Feliz hackeo!!!
Suscríbase a nuestro boletín hoy mismo y mejore sus conocimientos con información valiosa. ¡Es rápido, fácil y gratuito!