Tester la limite de propriété des factures

CybersécuritéBeginner
Pratiquer maintenant

Introduction

Une facture indique les achats d’un client, leur prix et son adresse de facturation. Un client doit pouvoir lire ses propres factures ou celles qui lui sont explicitement partagées. Connaître un identifiant ne donne pas le droit de lire l’objet.

Vous êtes autorisé à tester Invoice Desk avec des données synthétiques en tant qu’Alex. Établissez l’accès normal, comparez une facture partagée à une facture privée, puis enregistrez la réponse privée pour démontrer une faille de propriété. Le laboratoire s’arrête à la validation, sans réparation du serveur. Seuls les objets fournis sont autorisés.

Établir votre accès normal

Dans cette étape, connectez-vous en tant qu’Alex et récupérez votre facture avant de tester un autre compte.

Sélectionnez l’onglet Invoice Desk dans l’interface du laboratoire pour commencer cette étape.

Passez à l’onglet Invoice Desk. Le schéma montre un client qui envoie des requêtes et un serveur d’API qui y répond. Une API est l’interface de requêtes de l’application. API: ready provient d’une véritable requête de santé. La table indique les règles attendues :

Identifiant Propriétaire Partagée avec Alex peut lire ?
inv-104 alex Personne Oui : propriétaire
inv-208 morgan Personne Non : privée
inv-315 riley alex Oui : partage explicite

Dans le portail, saisissez l’utilisateur alex et le mot de passe shop-alex-42, puis cliquez sur Sign in. Attendez Signed in as alex. Saisissez inv-104 dans Invoice ID et cliquez sur View invoice. Le champ owner doit être alex.

Invoice Desk affiche Alex connecté consultant sa propre facture

Passez à l’onglet Client Terminal. C’est un espace client isolé dans /home/student/project, pas le serveur. invoice-api:8000 désigne le serveur dans ce réseau de formation, pas une cible publique. curl envoie des requêtes HTTP depuis le terminal. HTTP est le protocole requête/réponse utilisé ici ; GET demande la lecture d’une ressource. Le chemin après l’adresse identifie cette ressource. -i inclut le statut et les en-têtes de réponse.

Sans session, attendez 401 Unauthorized, qui exige une connexion :

Passez à l’onglet Client Terminal avant d’exécuter la commande suivante.

curl -i http://invoice-api:8000/api/invoices/inv-104

La connexion du navigateur ne connecte pas curl. Une session est un enregistrement côté serveur de l’identité connectée ; un cookie aléatoire relie les requêtes suivantes à cet enregistrement. La commande envoie un objet JSON, un format de champs nommés. -H définit un en-tête indiquant JSON, -d envoie les identifiants et choisit POST, et -c enregistre le cookie retourné dans session.txt. Les apostrophes conservent espaces et guillemets doubles dans un seul argument du shell.

curl -sS -c session.txt -H 'Content-Type: application/json' -d '{"username":"alex","password":"shop-alex-42"}' http://invoice-api:8000/api/login

-sS masque la progression mais affiche les erreurs de connexion. account doit être alex. -b envoie le cookie enregistré. Vérifiez l’identité de la session :

curl -sS -b session.txt http://invoice-api:8000/api/me

Demandez votre facture :

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-104

Lisez invoice_id, owner, item et total_usd : Alex a acheté Desk lamp pour 38.00. La liste vide shared_with, [], signifie qu’aucune autre personne n’est autorisée. C’est normal. Le contrôle porte sur la réponse réelle du serveur à Alex, depuis le terminal ou le portail.

Si vous obtenez 401 après connexion, répétez la commande de connexion dans ce terminal, puis réessayez avec -b session.txt. Une erreur de connexion est différente : aucune réponse HTTP ne vous est parvenue ; vérifiez l’adresse et API: ready.

Demander une autre facture

Dans cette étape, comparez le partage explicite à une facture privée en conservant la même identité connectée.

Sélectionnez l’onglet Client Terminal dans l’interface du laboratoire pour commencer cette étape.

L’authentification répond à « Qui êtes-vous ? ». L’autorisation répond à « Cette personne peut-elle lire cette facture ? ». La connexion ne règle que la première question. Téléchargez d’abord la facture légitimement partagée. Un téléchargement reste une requête GET ; /download sélectionne une réponse destinée à être enregistrée, avec les mêmes champs JSON.

Passez à l’onglet Client Terminal avant d’exécuter la commande suivante.

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-315/download

Le propriétaire est riley, mais shared_with contient alex. Cet accès est permis. Un propriétaire différent ne prouve pas à lui seul une faille.

Prévoyez ensuite le cas privé : inv-208 appartient à Morgan et n’est partagée avec personne. Alex devrait recevoir un refus, souvent 403 Forbidden. Un service peut aussi utiliser 404 Not Found pour dissimuler l’existence d’un objet privé. Ici, 404 désigne également un identifiant inconnu. 200 OK signifie que la requête a réussi ; le corps montre les données exposées.

-v affiche la requête envoyée et les en-têtes reçus, ainsi que votre cookie de session de formation. Ne diffusez pas cette sortie hors du laboratoire. Exécutez :

curl -v -b session.txt http://invoice-api:8000/api/invoices/inv-208

Repérez GET /api/invoices/inv-208 et HTTP/1.0 200 OK. Le corps indique le propriétaire morgan, une liste de partage vide, Studio microphone et l’adresse 82 Cedar Lane. Le serveur a fourni un objet privé à Alex. Vous avez changé le chemin de l’objet, pas l’identité de session. Les identifiants prévisibles facilitent le test ; l’absence de contrôle des permissions cause l’exposition.

Passez à l’onglet Invoice Desk pour répéter les deux requêtes : Download invoice pour inv-315 et View invoice pour inv-208. Le client web enregistre les téléchargements dans le même espace client. Le contrôle exige le téléchargement partagé autorisé et la consultation privée, pas un fichier d’explication.

Invoice Desk montre qu’Alex peut consulter la facture privée de Morgan

Vérifier l’exposition

Dans cette étape, conservez le véritable téléchargement privé et reliez les données exposées à leur impact métier.

Sélectionnez l’onglet Client Terminal dans l’interface du laboratoire pour commencer cette étape.

Utilisez /download pour la facture privée. -o écrit les octets de réponse dans un fichier au lieu de les afficher. Enregistrez la réponse complète dans private-invoice.json, dans l’espace client courant :

Passez à l’onglet Client Terminal avant d’exécuter la commande suivante.

curl -sS -b session.txt -o private-invoice.json http://invoice-api:8000/api/invoices/inv-208/download

cat affiche un fichier pour le lire :

cat private-invoice.json

Retrouvez la facture de Morgan : invoice_id inv-208, propriétaire morgan, montant 129.00 et adresse de facturation. Si vous avez enregistré une erreur 401 ou la facture partagée, reconnectez-vous si nécessaire puis téléchargez la facture privée désignée ; -o remplace le fichier.

Autre méthode : passez à l’onglet Invoice Desk. Connecté en tant qu’Alex, saisissez inv-208 puis cliquez sur Download invoice. Ce client web transmet la véritable requête API et enregistre la réponse intacte dans /home/student/project/private-invoice.json, consultable après être revenu à l’onglet Client Terminal. Les deux méthodes satisfont le même résultat.

Lancez le contrôle. Il compare les octets enregistrés à la facture désignée et vérifie que le serveur a enregistré ce téléchargement sous la session d’Alex. Une affirmation copiée, une facture inventée, une facture partagée autorisée ou un fichier sans téléchargement client correspondant ne démontrent pas le résultat.

L’impact est la divulgation des achats et de l’adresse d’un autre client. Le serveur doit vérifier la propriété ou le partage explicite pour chaque objet demandé, y compris les téléchargements. Cacher les liens ou rendre les identifiants difficiles à deviner ne remplace pas ce contrôle. C’est le problème d’autorisation au niveau objet décrit par OWASP BOLA. Votre test autorisé est terminé ; la réparation du serveur relève d’une tâche distincte.

Résumé

Vous avez établi une session client, lu votre facture, distingué partage explicite et accès privé, puis enregistré une véritable réponse entre comptes. Vous avez vérifié les données exposées et l’identité qui les a reçues, sans accès serveur ni identifiants de victime.