GraphQL introspección

Descripción

GraphQL es un lenguaje de manipulación y consulta de datos de código abierto para API y un entorno de ejecución para realizar consultas con datos existentes.​ GraphQL fue desarrollado internamente por Facebook en 2012 antes de ser lanzado públicamente en 2015. El 7 de noviembre de 2018, el proyecto GraphQL se trasladó de Facebook a la fundación GraphQL recientemente establecida, alojada por la Fundación Linux.

Explotación

En este caso, se va a utilizar la característica de introspección (habilitada en graphSQL) para ver las funciones y queries que pueden ser utilizadas por el servidor.

Esto permite conocer la estructura de las queries que pueden ser enviadas al servidor, con el fin de obtener información.

La siguiente imagen muestra el ejemplo de una página principal, la cual usa GraphQL.

Por defecto, GraphQL tiene un panel que pete enviar queries desde la propia web a través del recurso http://www.paginaweb.com/graphql.

Utilizando esta interfaz de usuario vamos a enviar queries al Backend para ver que datos y valores están disponible. Para ello se vamos a ver el esquema genérico mediante __schema de la siguiente forma:

{
  __schema {
    types {
      name
    }
  }
}

En este caso nos devuelve cierta información interesante, sin embargo, vamos a centrarnos en el campo UserObject para obtener más información.

Enviaremos una consulta más compleja, para que nos muestre más información sobre dicho campo:

{
  __type(name: "UserObject") {
    name
    fields {
      name
      type {
        name
        kind
        ofType {
          name
          kind
        }
      }
    }
  }
}

En este caso, para cada campo queremos saber cuáles son los subcampos y de qué tipo.

La aplicación mostraría el siguiente resultado:

En este caso, se puede observar que hay un campo interesante isAdmin, que podemos usar para averiguar quién es el administrador de la aplicación.

El siguiente paso es consultar todos los usuarios disponibles, para ello, necesitamos saber que tipo de consulta necesitamos enviar. Para saber que posible consulta podemos utilizar para ver todos los usuarios, utilizaremos la siguiente query:

query availableQueries {
  __schema {
    queryType {
      fields {
        name
        description
      }
    }
  }
}

Esto devuelve el campo allUsers:

Ahora que sabemos como ver todos los usuarios, vamos a realizar una nueva consulta, pero esta vez, vamos a mostrar todos los usuarios fieltrando por aquellos que tengan el valor isAdmin:

Con este campo, podemos hacer una nueva consulta para visualizar todos los usuarios

{
  allUsers {
    edges {
      node {
        username
        isAdmin
      }
    }
  }
}

Ahora, ya disponemos de los usuarios administradores de la aplicación:

Last updated