Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
lago-stripe-invoice-idor — Reproduit un IDOR CWE-639 dans Lago v1.53.0 où le webhook one-time de Stripe charge les factures sans restriction par organisation, permettant un contournement de paiement inter-organisations. Inclut un lab en boucle locale. | Kitploit
Outils/GitHubGitHub/abraxas/lago-stripe-invoice-idor
Authentification et AutorisationAnalyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionSécurité des APILabs et Pratique

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
GitHubabraxas/lago-stripe-invoice-idor

lago-stripe-invoice-idor

Reproduit un IDOR CWE-639 dans Lago v1.53.0 où le webhook one-time de Stripe charge les factures sans restriction par organisation, permettant un contournement de paiement inter-organisations. Inclut un lab en boucle locale.

Voir le dépôt
9il y a 18 joursPas encore vérifié
Partager

Abraxas Labs - lago-stripe-invoice-idor

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  lago-stripe-invoice-idor

lago-stripe-invoice-idor

Lago v1.53.0 - GetLago

POST /webhooks/stripe/:organization_id vérifie Stripe-Signature avec le secret de webhook de cette organisation d'URL. Ensuite, la branche one-time dans StripeService#update_payment_status charge la facture avec Invoice.find_by(id:) et sans organization_id. handle_missing_payment est bien scopé. Les factures Adyen passent déjà organization_id:. Cashfree et Flutterwave copient le find_by(id:) non scopé de Stripe. Ce lab concerne Stripe.

Un autre tenant sur la même base de données, avec Stripe connecté, peut marquer votre facture comme payée. Leur tableau de bord Stripe n'a aucun paiement correspondant. Le vôtre peut-être.

IDpas encore de CVE
CWECWE-639, CWE-345
CVSSÉlevé : 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N
ProduitLago / lago-api
Affectéjusqu'à v1.53.0 webhook one-time Stripe ; base de données partagée
Authorganisation attaquante avec Stripe connecté ; UUID de la facture victime
LicenceGNU Affero GPL v3.0
Lab127.0.0.1 uniquement

Ce qu'un attaquant peut faire

Signer un payment_intent.succeeded en tant que leur organisation, mettre payment_type=one-time et lago_invoice_id de votre facture. Le chemin scopé ne s'exécute jamais. La ligne victime devient payment_status=succeeded. Le rechargement de portefeuille / l'abonnement conditionné au paiement se débloque.

Pas non authentifié. Pas un shell. Un self-host mono-organisation n'est pas ce bug : ce secret de signature possède déjà les payables de cette organisation. Il vous faut un UUID de facture victime (URL du portail, email, PDF, API fuitée) et une ligne stripe_customer victime. Événement factice. Pas de Stripe en production.

Même arbre que l'ATO acceptInvite. Bug différent.

Comment je l'ai trouvé

J'ai lu update_payment_status, puis le find_by(id:) de create_payment one-time, puis le organization_id: de handle_missing_payment. Le commentaire sur le chemin scopé craint le même secret Stripe utilisé à travers les organisations. La branche one-time a oublié d'avoir peur.

Le premier client qui regarde ça va POSTer un payment_intent.succeeded sans payment_type. handle_missing_payment cherche la facture et organization_id. Organisation attaquante, facture victime. nil. En attente. C'est le contrôle. Le lab l'affirme.

Fausses pistes déjà consignées : signer avec le secret de webhook de la victime (là vous possédez déjà les payables de ce marchand) ; self-host mono-organisation ; UUID de facture de l'organisation attaquante (paiement intra-organisation) ; pas de stripe_customer sur la victime (exception, pas succeeded) ; traiter le HTTP 200 du webhook comme l'oracle (le job est asynchrone - poller GET /api/v1/invoices/:id) ; un reverse shell. Du théâtre.

Ensuite : deux appels registerUser plantent Victim Corp et Attacker Corp. La clé REST de la victime crée un add-on, un client, et une facture impayée avec skip_psp pour ne pas avoir besoin d'un PSP en production pour créer la ligne. seed_stripe.rb plante les providers Stripe et un stripe_customer sur la victime. webhook_secret factice. sk_test_lab_* factice. Événement de contrôle signé, sans payment_type : toujours en attente. Événement signé avec payment_type=one-time : succeeded, paid=1000.

Lab

cd lab
./run.sh

Cible uniquement http://127.0.0.1:13001. L'ATO acceptInvite utilisait 13000. Celui-ci ne partage pas de volume avec ce lab.

IOC payment_status_before=pending
IOC control webhook (no payment_type) payment_status_after_control=pending
IOC attack webhook payment_type=one-time
IOC poll payment_status=succeeded paid=1000
SUCCESS Lago Stripe one-time webhook unscoped invoice

Le correctif

Invoice.find_by(id:, organization_id:) sur le chemin one-time, comme le font déjà handle_missing_payment et les factures Adyen. Idem pour Cashfree/Flutterwave.

Références

  • github.com/getlago/lago tag v1.53.0 · lago-api
  • webhooks_controller.rb · stripe_service.rb · adyen_service.rb · cashfree_service.rb · flutterwave_service.rb
  • Même produit : lago-invite-ato
  • CWE-639 · CWE-345

Licence

GNU Affero GPL v3.0. Voir LICENSE. Lab en loopback uniquement. Aucune garantie.

Télécharger l’outil