Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
lago-stripe-invoice-idor — Reproduziert eine CWE-639-IDOR in Lago v1.53.0, bei der der Stripe-Einmal-Webhook Rechnungen ohne Organisations-Scoping lädt, was eine organisationsübergreifende Zahlungsumgehung ermöglicht. Enthält ein Loopback-Lab. | Kitploit
Tools/GitHubGitHub/abraxas/lago-stripe-invoice-idor
Authentifizierung & AutorisierungSchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsAPI-SicherheitLabs & Praxis

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
GitHub
abraxas/lago-stripe-invoice-idor

lago-stripe-invoice-idor

Reproduziert eine CWE-639-IDOR in Lago v1.53.0, bei der der Stripe-Einmal-Webhook Rechnungen ohne Organisations-Scoping lädt, was eine organisationsübergreifende Zahlungsumgehung ermöglicht. Enthält ein Loopback-Lab.

Repository anzeigen
9vor 16 TagenNoch nicht geprüft

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 verifiziert Stripe-Signature mit dem Webhook-Secret der Organisation aus dieser URL. Dann lädt der One-Time-Zweig in StripeService#update_payment_status die Rechnung mit Invoice.find_by(id:) und ohne organization_id. handle_missing_payment ist eingegrenzt. Adyen-Rechnungen übergeben bereits organization_id:. Cashfree und Flutterwave kopieren das nicht eingegrenzte Stripe find_by(id:). Dieses Lab ist Stripe.

Ein anderer Tenant auf derselben Datenbank, mit verbundenem Stripe, kann deine Rechnung als bezahlt markieren. Dessen Stripe-Dashboard hat keine passende Abbuchung. Deines vielleicht schon.

IDnoch keine CVE
CWECWE-639, CWE-345
CVSSHigh: 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N
ProduktLago / lago-api
Betroffenbis v1.53.0 Stripe One-Time-Webhook; geteilte Datenbank
AuthAngreifer-Org mit verbundenem Stripe; UUID der Opfer-Rechnung
LizenzGNU Affero GPL v3.0
Labnur 127.0.0.1

Was ein Angreifer tun kann

Signiere ein payment_intent.succeeded als seine Org, setze payment_type=one-time und lago_invoice_id von deiner Rechnung. Der eingegrenzte Pfad läuft nie. Die Opfer-Zeile wird payment_status=succeeded. Wallet-Aufladung / zahlungsgeschütztes Abo wird freigeschaltet.

Nicht unauthentifiziert. Keine Shell. Single-Org-Self-Host ist nicht dieser Bug: dieses Signing-Secret besitzt bereits die Zahlungsverbindlichkeiten dieser Org. Du brauchst eine UUID der Opfer-Rechnung (Portal-URL, E-Mail, PDF, geleakte API) und eine stripe_customer-Zeile des Opfers. Dummy-Event. Kein Live-Stripe.

Derselbe Tree wie der acceptInvite ATO. Anderer Bug.

Wie ich es gefunden habe

Ich las update_payment_status, dann das One-Time-create_payment find_by(id:), dann das organization_id: von handle_missing_payment. Der Kommentar auf dem eingegrenzten Pfad fürchtet dasselbe Stripe-Secret, das über Orgs hinweg verwendet wird. Der One-Time-Zweig hat vergessen, sich zu fürchten.

Der erste Client, der sich das ansieht, wird ein payment_intent.succeeded ohne payment_type POSTen. handle_missing_payment sucht die Rechnung und organization_id. Angreifer-Org, Opfer-Rechnung. nil. Pending. Das ist die Kontrolle. Das Lab bestätigt sie.

Fehlversuche bereits festgehalten: Signieren mit dem Webhook-Secret des Opfers (dann besitzt du bereits die Zahlungsverbindlichkeiten dieses Merchants); Single-Org-Self-Host; Rechnungs-UUID aus der Angreifer-Org (In-Org-Zahlung); kein stripe_customer beim Opfer (Exception, nicht succeeded); Webhook-HTTP-200 als Orakel behandeln (der Job ist asynchron - poll GET /api/v1/invoices/:id); eine Reverse Shell. Theater.

Dann: zwei registerUser-Aufrufe legen Victim Corp und Attacker Corp an. Der Victim-REST-Key erstellt ein Add-on, einen Kunden und eine unbezahlte Rechnung mit skip_psp, sodass ich kein Live-PSP brauchte, um die Zeile zu erzeugen. seed_stripe.rb legt Stripe-Provider und einen stripe_customer beim Opfer an. Dummy-webhook_secret. Dummy-sk_test_lab_*. Signiertes Kontroll-Event, kein payment_type: weiterhin pending. Signiertes Event mit payment_type=one-time: succeeded, paid=1000.

Lab

cd lab
./run.sh

Ziel nur http://127.0.0.1:13001. Invite ATO verwendete 13000. Dieses teilt kein Volume mit jenem 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

Der Fix

Invoice.find_by(id:, organization_id:) auf dem One-Time-Pfad, so wie es handle_missing_payment und Adyen-Rechnungen bereits tun. Dasselbe für Cashfree/Flutterwave.

Referenzen

  • 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
  • Gleiches Produkt: lago-invite-ato
  • CWE-639 · CWE-345

Lizenz

GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.

Tool herunterladen