
हाइपरस्विच पेआउट कन्फर्म फ्लॉ के लिए प्रूफ-ऑफ-कॉन्सेप्ट और लैब: POST /payouts/{id}/confirm में एक डमी client_secret के साथ राशि जोड़ने पर संग्रहीत पेआउट राशि बढ़ जाती है।
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · hyperswitch-payout-confirm-secret
Hyperswitch 2026.09.21.0 - Juspay
payouts_confirm check_value_present("client_secret") के माध्यम से pk_ को प्रमाणित करता है। मौजूद है। बराबर नहीं। Payments confirm अभी भी बाइंड करता है: authenticate_client_secret बेमेल होने पर IR_09 लौटाता है। confirm body एक पूर्ण PayoutCreateRequest है। update_payouts_and_payout_attempt कनेक्टर रूटिंग से पहले amount लिखता है।
payouts confirm पर डमी client_secret और amount=99900 99900 संग्रहीत करता है। उसी डमी के साथ payments confirm अभी भी IR_09 है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-863, CWE-345 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Product | Hyperswitch |
| Affected | 2026.09.21.0 तक payouts confirm |
| Auth | publishable pk_ और payout id; डमी secret |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
publishable key (सार्वजनिक, checkout) और payout id (payout link, merchant dashboard, client create response) चाहिए। डमी secret और नए amount के साथ POST /payouts/{id}/confirm करें। Retrieve बढ़ी हुई राशि दिखाता है, भले ही कनेक्टर रूटिंग 400 IR_39 (कोई योग्य payout कनेक्टर नहीं) लौटाए। लेखन पहले ही हो चुका है। जिस shop में payout processor है, वहाँ fulfillment अगला कदम है।
pk_ के बिना guest यह बग नहीं है। Secret sk_ confirm merchant-side है। यह shell नहीं है। इस lab image पर सफल कनेक्टर payout नहीं है।
unsigned Worldpayxml webhook के समान product। अलग बग।
मैंने check_value_present पढ़ा, फिर payments req_cs != pi_cs, फिर payouts_core से पहले update_payouts_and_payout_attempt। pk_ के लिए auth "checkout SDK" है। secret का उद्देश्य browser session को इस payout से बाइंड करना है। Payments समानता करता है। Payouts उपस्थिति करता है। एक गैर-रिक्त डमी पर्याप्त है। JSON अभी भी एक create request है, इसलिए confirm पर amount no-op नहीं है।
पहला client जो इसे देखेगा वह client_secret के बिना confirm भेजेगा और MissingRequiredField प्राप्त करेगा। मौजूद है। असली secret भेजें और आप payer हैं। payments confirm पर डमी भेजें और आपको IR_09 मिलेगा। यही नियंत्रण है। payouts confirm पर डमी भेजें।
पहले से दर्ज गलत मोड़: HTTP 400 IR_39 को "कुछ नहीं हुआ" मानना (payout retrieve करें); amount 1000 रहता है क्योंकि confirm ने amount छोड़ दिया (unwrap_or पुराना मान रखता है); payout पहले से terminal (Success / Failed / Cancelled); एक reverse shell। नाटक। साक्षी है डमी secret के बाद retrieve amount=99900, जबकि payments confirm अभी भी IR_09 है।
फिर: एक merchant, एक secret key, एक publishable pk_, एक worldpayxml payout कनेक्टर बनाएं, और confirm=false amount 1000 के साथ POST /payouts/create करें। RequiresConfirmation। Payments डमी-secret नियंत्रण। Payouts डमी 99900। Retrieve।
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:18083। webhook lab के साथ compose project साझा न करें।
IOC amount_before=1000 status_before=requires_confirmation
IOC payments.confirm dummy-secret status=400 IR_09 client_secret mismatch
IOC payouts.confirm dummy-secret status=400 IR_39 no eligible connector
IOC retrieve amount=99900 status=requires_confirmation
SUCCESS Hyperswitch payout confirm unbound client_secret amount raise
client_secret की तुलना payouts.client_secret से उसी तरह करें जैसे payments करता है, और उस जाँच के पास होने तक confirm पर PayoutCreateRequest.amount लागू न करें। डमी secret को IR_09 (या 401) होना चाहिए, और retrieve amount को 1000 रहना चाहिए।
payouts.rs routes · authentication.rs · payouts/helpers.rs · core/payouts.rs · payments/helpers.rsGNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई वारंटी नहीं।