Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
hyperswitch-unsigned-webhook — 针对未认证的 Hyperswitch Worldpayxml webhook 漏洞(CWE-345/306)的概念验证,该漏洞可伪造 SETTLED XML,从而在未经 PSP 捕获的情况下将支付标记为成功。 | Kitploit
工具/GitHubGitHub/abraxas/hyperswitch-unsigned-webhook
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试身份验证实验室与实践
GitHubabraxas/hyperswitch-unsigned-webhook

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

hyperswitch-unsigned-webhook

针对未认证的 Hyperswitch Worldpayxml webhook 漏洞(CWE-345/306)的概念验证,该漏洞可伪造 SETTLED XML,从而在未经 PSP 捕获的情况下将支付标记为成功。

查看仓库
715天前尚未审核
分享

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 返回 Ok(true),并附有一条注释称验证通过 mTLS 完成。该路由上并没有 mTLS。该函数忽略请求体和请求头。incoming.rs 随后信任 source_verified,并在没有 PSync 的情况下执行 HandleResponse。LastEvent::Settled 映射为 PaymentIntentSuccess。默认的 IncomingWebhook 算法是 NoAlgorithm。BitPay 和 Shift4 继承该行为。Worldpayxml 甚至走不到那一步。它直接短路了。

未认证的伪造 SETTLED XML 即可将支付标记为成功。没有 Worldpay 捕获。没有客户端证书。

ID暂无 CVE
CWECWE-345、CWE-306
CVSS高危:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
产品Hyperswitch
受影响版本截至 2026.09.21.0 的 Worldpayxml 入站 webhook
认证无需认证;需要 merchant_id 和 orderCode
许可证GNU Affero GPL v3.0
实验环境仅限 127.0.0.1

攻击者能做什么

需要 merchant_id(出现在每个 Hyperswitch 仪表盘 URL 中)以及等于该尝试的 connector_transaction_id 的 orderCode。向 /webhooks/{merchant_id}/worldpayxml POST 未签名的 SETTLED。如果 source_verified 为 false,incoming 会执行 Trigger 并对连接器进行 PSync。Worldpayxml 从不走这条路径。支付意图变为 Charged。实验环境:status=succeeded。伪造 XML。没有 PSP。

猜测支付 ID 不是漏洞。为你已经看到的 ID 伪造 SETTLED 才是。不是 shell。不是真实的 Worldpay 结算。

同一产品,不同漏洞:payout confirm unbound client_secret。

我是如何发现的

我读了 Ok(true),然后是 HandleResponse 与 Trigger 的对比,再是 Settled -> PaymentIntentSuccess。注释说是 mTLS。实验环境的 POST 没有客户端证书。

第一个看到这一点的客户端会针对 requires_confirmation POST webhook。Incoming 不会将尚未离开确认状态的支付变为 Charged。给该尝试打上标记,或者等到 requires_capture / processing。实验环境执行打标记。该标记是实验环境的固定装置。真实尝试已经有连接器 ID。而 webhook 没有。

已记录的弯路:在真正执行验证的连接器上使用签名 HMAC(这条路径不验证);将 webhook HTTP 200 当作判定依据(轮询 GET /payments/{id} 直到 status=succeeded);orderCode 不是 connector_transaction_id;反弹 shell。都是做戏。

然后:商户、API 密钥、worldpayxml MCA、使用 confirm=false 的支付、打上 connector_transaction_id 标记、未签名 SETTLED、检索。

实验环境

cd lab
./run.sh

目标仅限 http://127.0.0.1:18082。run.sh 将标签 2026.09.21.0 克隆到 lab/hyperswitch-src 以获取配置和迁移。

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

修复方案

验证 Worldpay 通知(签名 / 该路由实际终止的 mTLS)。不要对从空操作返回 Ok(true) 的连接器执行 HandleResponse。未签名的 SETTLED 不得将支付意图变为成功。

参考资料

  • github.com/juspay/hyperswitch 标签 2026.09.21.0
  • worldpayxml.rs · transformers.rs · incoming.rs · webhooks.rs · crypto.rs
  • 同一产品:hyperswitch-payout-confirm-secret
  • CWE-345 · CWE-306

许可证

GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。

下载工具