GraphQL – Ataques y Seguridad

GraphQL es un lenguaje de consulta para API, que utiliza la estructura gráfica para almacenar datos. Es como cualquier otra API REST Hoy en día, la implementación de GraphQL es muy común en el desarrollo de aplicaciones. Empresas tecnológicas como Facebook, Yahoo, Shopify, Twitter también implementaron GraphQL para su comunicación interna, mutación y eliminación de datos.

Por lo general, cuando los desarrolladores escriben una API, escriben muchos puntos finales para varias operaciones. En el siguiente ejemplo, se muestra cómo la aplicación utiliza varios puntos finales de API REST para acceder a diferentes servicios 

  1. OBTENER /api/recurso_1
  2. OBTENER /api/recurso_2
  3. POST /api/recurso_1

Esto da como resultado varios puntos finales, uno por cada operación CRUD (Crear, Leer, Actualizar, Eliminar) por recurso para ex-post, comentarios, datos de usuario, archivos, pero GraphQL es un tipo especial de API que tenemos que administrar y usar solo uno punto final En general, representamos los datos en forma de hojas de cálculo que tienen filas y columnas, pero en la aplicación web requerimos que todos los datos estén vinculados entre sí y la forma natural de estos datos es el gráfico. GraphQL es más común en aplicaciones nuevas.

GraphQL tiene funciones como Consultas, Mutaciones, Fragmentos y Metacampos. Todas estas funciones hacen que GraphQL sea muy potente y ayuda a obtener, actualizar y eliminar datos de una manera organizada y más sencilla. Las consultas son flexibles de usar y al usar la consulta podemos solicitar cualquier entidad, incluidas las entidades relacionadas y los campos asociados con esas entidades. Las consultas se escriben como una función que puede devolver uno o más valores y también podemos incluir argumentos.

Ejemplo:

REQUEST:-
{
  student {
    name,
    id,
    password
  }
}

RESPONSE:-
{
  "data": {
    "student": {
      "name": "Siddhant"
      "id" : "112"
      "password" : "GFG2020"
    }
  }
}

Funcionamiento de GraphQL:

Hay dos partes principales que determinan el funcionamiento de GraphQL:

  1. Esquema
  2. Resolver funciones

Esquema:

El esquema en GraphQL es un modelo de datos que se puede consultar desde el servidor. Establece el tipo de consultas válidas y autorizadas que puede realizar un cliente.

Eche un vistazo a la siguiente notación de esquema de GraphQL:

type Employee {
  id: Int
  name: String
  posts: [Post]
}type Salary{
  id: Int
  title: String
  Amount: Int
  employee: Employee
}type Query {
  getEmployee(id: Int): Employee
  getSalary(titleContains: String): [Post]
}schema {
  query: Query
}

En el esquema anterior, hay 3 tipos, a saber, Empleado, Salario y Consulta. Aquí la consulta marca el punto de entrada al esquema. Todas las consultas deben comenzar con getEmployee o getSalary para ser validadas. Además, los objetos Empleado y Salario se referencian entre sí.

Funciones de resolución:

Las funciones de resolución en GraphQL actúan de manera similar a un enrutador. Son responsables de establecer relaciones entre campos y tipos en un esquema GraphQL. Estas funciones son compatibles con todo tipo de backends, incluso con otros servidores GraphQL. A continuación se muestra un ejemplo de función de resolución:

getEmployee(_, args){
  return sql.raw('SELECT * FROM Employee WHERE id = %s', args.id);
}Salary(employee){
  return request(`https://YOUR_URL/${employee.id}`);
}

Nota: No se recomienda escribir la consulta y la URL directamente en la función de resolución.

Enfoque para probar los errores de GraphQL:

1. Introspección:

La introspección es una de las características extrañas de GraphQL. Esto es muy importante para hacer la introspección durante las pruebas de la API. En GraphQL, brinda mucha información sobre la implementación de GraphQL. Hay tres errores más comunes relacionados con los puntos finales de graphql : errores de lógica comercial, IDORS, divulgación de información y omisión de firewall. Las API de GraphQL ubicadas específicamente en puntos finales particulares como qql, graphql, console, graphilq , etc. La parte más difícil de la búsqueda de graphql es comprender la sintaxis después de comprender la sintaxis implementada, podemos avanzar fácilmente para probar las API de GraphQL.

  1. Interceptar la solicitud HTTP que desea probar
  2. Reemplace el contenido de la consulta con una consulta de introspección genérica en la solicitud POST
  3. Pruebe el mismo proceso en diferentes puntos finales
  4. Si obtuvo 200 respuestas OK, obtendrá una base de datos interna en el cuerpo de la respuesta.
  5. Use la extensión Inql Burp Suite para comprender la implementación de GraphQL

2. Límite de velocidad insuficiente:

Compruebe siempre la limitación de velocidad insuficiente en los puntos finales de la API. Es posible aplicar fuerza bruta a la consulta de GraphQL para obtener información de los servidores back-end. Un atacante puede aplicar fuerza bruta al token de restablecimiento de contraseña en el punto final de restablecimiento de contraseña para cambiar la contraseña de la víctima. Este pequeño ataque conduce a una vulnerabilidad de apropiación de cuenta completa. La implementación débil de la protección de limitación de velocidad conduce a ataques DDos que provocan la caída del servidor.

3. Validación faltante en la funcionalidad CRUD:

En la aplicación Crear, Leer, Actualizar y Eliminar son las funciones más importantes y críticas. GraphQL parece muy simple cuando se trata de usar, pero algo complejo desde el punto de vista de la implementación. Durante la implementación de cada función, utilice siempre el token de autorización. Cada ficha debe ser única. Para verificar este error, verifique cada funcionalidad cambiando los parámetros de consulta (como nombre de usuario, identificación de usuario, etc.). Si da resultados de ÉXITO para la solicitud manipulada, entonces falta la validación en la funcionalidad CRUD.

Herramientas para probar la seguridad de GraphQL:

  1. Voyager de GraphQL
  2. Extensión de la suite de eructos Inql
  3. GraphQL-ruta-enumeración

Publicación traducida automáticamente

Artículo escrito por siddhantgore y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *