HTTP Method Manipulation in GraphQL
Manipulation de méthode HTTP dans GraphQL
Description
La manipulation de méthode HTTP consiste à exploiter les incohérences dans la façon dont les serveurs GraphQL gèrent les méthodes HTTP. Dans GraphQL, si le serveur autorise de manière incorrecte l'exécution de mutations à l'aide de requêtes GET, des données sensibles peuvent être exposées dans les URL, entraînant ainsi des vulnérabilités de sécurité.
Si un proxy est utilisé pour router les requêtes, le risque augmente, car les proxys peuvent consigner ces URL dans les journaux, stockant ainsi par inadvertance des informations sensibles (telles que des clés d'API ou des données d'utilisateurs), qui pourraient ensuite être compromises si ces journaux sont consultés.
Les implications de sécurité de la manipulation de la méthode HTTP dans GraphQL comprennent :
- Exposition de données sensibles : Lorsque des informations sensibles (par exemple, des paramètres de mutation) sont incluses dans une URL, elles peuvent être exposées aux journaux ou à d'autres tiers non autorisés.
- Risques liés aux proxys : Si un proxy enregistre les URL des requêtes, les données sensibles intégrées dans les requêtes GET peuvent être stockées et consultées ultérieurement par des personnes non autorisées.
- Contrôle d'accès inadéquat : Autoriser des mutations via des requêtes GET peut conduire à l'exécution d'opérations non sécurisées sans mesures de protection appropriées.
Pour vérifier si une API GraphQL est vulnérable à cela, vous pouvez essayer d'exécuter une mutation à l'aide d'une requête 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 la mutation est autorisée via GET, cela indique une vulnérabilité potentielle qui doit être corrigée.
Recommandation
Afin d'atténuer les risques associés à la manipulation de méthode HTTP dans GraphQL, suivez ces pratiques de sécurité :
-
Forcer les mutations uniquement via POST : Assurez-vous que les mutations ne peuvent être exécutées que via la méthode POST. Rejetez toute demande de mutation effectuée à l'aide de GET pour éviter que des informations sensibles ne soient transmises dans les URL.
-
Désactiver GET pour les mutations : Mettez à jour les configurations du serveur pour interdire explicitement les mutations via les requêtes GET. Cela garantit qu'aucune opération d'altération de données ne peut être effectuée via une 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 }); ```
Liens
Normes
- 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