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
hyperswitch-unsigned-webhook — Preuve de concept pour une faille de webhook Hyperswitch Worldpayxml non authentifiée (CWE-345/306) qui falsifie du XML SETTLED pour marquer des paiements comme réussis sans capture PSP. | Kitploit
Outils/GitHubGitHub/abraxas/hyperswitch-unsigned-webhook
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionAuthentificationLabs et Pratique
GitHub
abraxas/hyperswitch-unsigned-webhook

hyperswitch-unsigned-webhook

Preuve de concept pour une faille de webhook Hyperswitch Worldpayxml non authentifiée (CWE-345/306) qui falsifie du XML SETTLED pour marquer des paiements comme réussis sans capture PSP.

Voir le dépôt
7il y a 15 joursPas encore vérifié

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 →
Partager

Abraxas Labs - hyperswitch-unsigned-webhook

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  hyperswitch-unsigned-webhook

hyperswitch-unsigned-webhook

Hyperswitch 2026.09.21.0 - Juspay

Worldpayxml::verify_webhook_source renvoie Ok(true) avec un commentaire indiquant que la vérification est effectuée via mTLS. Il n'y a pas de mTLS sur cette route. La fonction ignore le corps et les en-têtes. incoming.rs fait ensuite confiance à source_verified et prend HandleResponse sans PSync. LastEvent::Settled correspond à PaymentIntentSuccess. L'algorithme par défaut de IncomingWebhook est NoAlgorithm. BitPay et Shift4 en héritent. Worldpayxml n'atteint même pas ce stade. Il court-circuite.

Un XML SETTLED factice non authentifié marque le paiement comme réussi. Aucune capture Worldpay. Aucun certificat client.

IDpas encore de CVE
CWECWE-345, CWE-306
CVSSÉlevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
ProduitHyperswitch
Affectéjusqu'à 2026.09.21.0 webhooks entrants Worldpayxml
Authnon authentifié ; nécessite merchant_id et orderCode
LicenceGNU Affero GPL v3.0
Lab127.0.0.1 uniquement

Ce qu'un attaquant peut faire

Il faut merchant_id (présent dans chaque URL du tableau de bord Hyperswitch) et orderCode égal au connector_transaction_id de la tentative. POST /webhooks/{merchant_id}/worldpayxml avec un SETTLED non signé. Si source_verified était faux, incoming déclencherait Trigger et ferait un PSync du connecteur. Worldpayxml ne prend jamais ce chemin. L'intent passe à Charged. Lab : status=succeeded. XML factice. Aucun PSP.

Deviner les identifiants de paiement n'est pas le bug. Forger un SETTLED pour un identifiant déjà observé l'est. Pas un shell. Pas un règlement Worldpay réel.

Même produit, bug différent : payout confirm unbound client_secret.

Comment je l'ai trouvé

J'ai lu Ok(true), puis HandleResponse vs Trigger, puis Settled -> PaymentIntentSuccess. Le commentaire mentionne mTLS. Le POST du lab n'a pas de certificat client.

Le premier client qui examine cela va POSTer le webhook contre requires_confirmation. Incoming ne passera pas un paiement à Charged s'il n'a pas quitté la confirmation. Marquez la tentative, ou attendez requires_capture / processing. Le lab effectue le marquage. Ce marquage est un artifice de lab. Une tentative réelle possède déjà l'identifiant du connecteur. Le webhook, non.

Fausses pistes déjà consignées : HMAC signé sur un connecteur qui vérifie réellement (ce chemin ne le fait pas) ; traiter le HTTP 200 du webhook comme l'oracle (interroger GET /payments/{id} jusqu'à status=succeeded) ; un orderCode qui n'est pas connector_transaction_id ; un reverse shell. Du théâtre.

Ensuite : marchand, clé API, MCA worldpayxml, paiement avec confirm=false, marquage de connector_transaction_id, SETTLED non signé, récupération.

Lab

cd lab
./run.sh

Cible uniquement http://127.0.0.1:18082. run.sh clone le tag 2026.09.21.0 dans lab/hyperswitch-src pour la configuration et les migrations.

IOC status_before=requires_confirmation
IOC webhook status=200 unsigned lastEvent=SETTLED
IOC poll status=succeeded
SUCCESS Hyperswitch unsigned Worldpayxml webhook Charged

Le correctif

Vérifier la notification Worldpay (signature / mTLS que la route termine réellement). Ne pas faire de HandleResponse sur un connecteur qui a renvoyé Ok(true) depuis une opération vide. Un SETTLED non signé ne doit pas faire passer l'intent à succeeded.

Références

  • github.com/juspay/hyperswitch tag 2026.09.21.0
  • worldpayxml.rs · transformers.rs · incoming.rs · webhooks.rs · crypto.rs
  • Même produit : hyperswitch-payout-confirm-secret
  • CWE-345 · CWE-306

Licence

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

Télécharger l’outil