Saltar a contenido

HTTP Method Manipulation in GraphQL

Manipulación de métodos HTTP en GraphQL

Descripción

La manipulación de métodos HTTP implica explotar inconsistencias en cómo los servidores GraphQL manejan los métodos HTTP. En GraphQL, si el servidor permite incorrectamente que se ejecuten mutaciones mediante solicitudes GET, los datos confidenciales podrían exponerse en las URL, lo que genera vulnerabilidades de seguridad.

Si se utiliza un proxy para enrutar las solicitudes, el riesgo aumenta, ya que los proxies pueden registrar estas URL, almacenando inadvertidamente información confidencial (como claves de API o datos de usuarios), que luego podría verse comprometida si se accede a los registros.

Las implicaciones de seguridad de la manipulación de métodos HTTP en GraphQL incluyen:

  • Exposición de datos confidenciales: Cuando se incluye información confidencial (por ejemplo, parámetros de mutación) en una URL, puede quedar expuesta a registros u otras partes no deseadas.
  • Riesgos de proxy: Si un proxy registra las URL de las solicitudes, los datos confidenciales integrados en las solicitudes GET pueden almacenarse y ser accedidos posteriormente por personas no autorizadas.
  • Control de acceso inadecuado: Permitir mutaciones a través de solicitudes GET podría llevar a que se realicen operaciones inseguras sin las salvaguardas adecuadas.

Para verificar si una API GraphQL es vulnerable a esto, puede intentar ejecutar una mutación utilizando una solicitud GET:

import requests

response = requests.get("https://your-graphql-endpoint.com/graphql", 
    params={
        'query': 'mutation { MutationName(input: { yourField: "value" }) { resultField } }'
    })
fetch('https://your-graphql-endpoint.com/graphql?query=mutation%20{updateUser(id:%201,name:%20%22Malicious%22)}', {
  method: 'GET'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

Si se permite la mutación a través de GET, indica una vulnerabilidad potencial que debe abordarse.

Recomendación

Para mitigar los riesgos asociados con la manipulación de métodos HTTP en GraphQL, siga estas prácticas de seguridad:

  1. Forzar mutaciones solo mediante POST: Asegúrese de que las mutaciones solo se puedan ejecutar a través del método POST. Rechace cualquier solicitud de mutación realizada mediante GET para evitar que se pase información confidencial en las URL.

  2. Deshabilitar GET para mutaciones: Actualice las configuraciones del servidor para prohibir explícitamente las mutaciones a través de solicitudes GET. Esto garantiza que no se puedan realizar operaciones que alteren los datos a través de una URL.

from flask import request, jsonify
from flask_graphql import GraphQLView

@app.route('/graphql', methods=['POST'])
def graphql():
    return GraphQLView.as_view('graphql')()

```javascript // Example of setting method restrictions in Express.js app.post('/graphql', (req, res) => { // Handle GraphQL mutations here });

app.get('/graphql', (req, res) => { res.status(405).send('Method Not Allowed'); // Reject GET requests }); ```

Enlaces

Estándares

  • OWASP_ASVS_L1:
    • V4_1_3
    • V5_3_3
  • OWASP_ASVS_L2:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V9_1_2
  • OWASP_ASVS_L3:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V9_1_2
    • V12_1_1
    • V13_4_1
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213